How do I create a variable number of variables?How can you dynamically create variables via a while loop?Using a string variable as a variable nameHow to get the value of a variable given its name in a string?generating variable names on fly in pythonChanging variable names with Python for loopsReturn a variable by name from a function in PythonHow to increment variable names/Is this a bad ideaHow can I create lists from a list of strings?In python create a list with a variable in the nameHow to use string value as a variable name in Python?How do I merge two dictionaries in a single expression?How do I check if a list is empty?How do I check whether a file exists without exceptions?How can I safely create a nested directory?How do I return multiple values from a function?Using global variables in a functionGetting the class name of an instance?How do I sort a dictionary by value?How do I pass a variable by reference?How do I list all files of a directory?
A variation on Caesar
What type of beer is best for beer battered fish?
Basic Accidental Question
How to present boolean options along with selecting exactly 1 of them as "primary"?
What are these criss-cross patterns close to Cambridge Airport (UK)?
Hole in PCB due to corrosive reaction?
How do the Martian rebels defeat Earth when they're grossly outnumbered and outgunned?
"Chess is 90% tactics" - should a player focus more on tactics in order to improve?
How does the sorcerer's Careful Spell Metamagic option work with the Thunderwave spell?
Google just EOLed the original Pixel. How long until it's a brick?
Pi to the power y, for small y's
What information could a Time Traveller give to the Germans to make them win the war?
Need Good OOP Design For World and Countries Problem
What's the name of the role of characters who buff teammates?
Is there a way to realize a function of type ((a -> b) -> b) -> Either a b?
How do I resolve science-based problems in my worldbuilding?
Fake TL072/TL074 IC's - how does the economics of it work?
Are the EVA suits used in the ISS and in the NBL same or different?
Very high precision zero crossing detection
A question about the に in this sentence
Why are Democrats mostly focused on increasing healthcare spending, rarely mentioning any proposals for decreasing the costs of healthcare services?
An historical mystery : Poincaré’s silence on Lebesgue integral and measure theory?
What is the meaning of Text inside of AMS logo
count network interfaces in bash
How do I create a variable number of variables?
How can you dynamically create variables via a while loop?Using a string variable as a variable nameHow to get the value of a variable given its name in a string?generating variable names on fly in pythonChanging variable names with Python for loopsReturn a variable by name from a function in PythonHow to increment variable names/Is this a bad ideaHow can I create lists from a list of strings?In python create a list with a variable in the nameHow to use string value as a variable name in Python?How do I merge two dictionaries in a single expression?How do I check if a list is empty?How do I check whether a file exists without exceptions?How can I safely create a nested directory?How do I return multiple values from a function?Using global variables in a functionGetting the class name of an instance?How do I sort a dictionary by value?How do I pass a variable by reference?How do I list all files of a directory?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty
margin-bottom:0;
How do I accomplish variable variables in Python?
Here is an elaborative manual entry, for instance: Variable variables
I have heard this is a bad idea in general though, and it is a security hole in Python. Is that true?
python variable-variables
add a comment
|
How do I accomplish variable variables in Python?
Here is an elaborative manual entry, for instance: Variable variables
I have heard this is a bad idea in general though, and it is a security hole in Python. Is that true?
python variable-variables
25
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
3
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18
add a comment
|
How do I accomplish variable variables in Python?
Here is an elaborative manual entry, for instance: Variable variables
I have heard this is a bad idea in general though, and it is a security hole in Python. Is that true?
python variable-variables
How do I accomplish variable variables in Python?
Here is an elaborative manual entry, for instance: Variable variables
I have heard this is a bad idea in general though, and it is a security hole in Python. Is that true?
python variable-variables
python variable-variables
edited Mar 22 '17 at 16:21
Taryn♦
202k47 gold badges306 silver badges366 bronze badges
202k47 gold badges306 silver badges366 bronze badges
asked Sep 3 '09 at 12:37
PyornidePyornide
25
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
3
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18
add a comment
|
25
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
3
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18
25
25
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
3
3
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18
add a comment
|
13 Answers
13
active
oldest
votes
You can use dictionaries to accomplish this. Dictionaries are stores of keys and values.
>>> dct = 'x': 1, 'y': 2, 'z': 3
>>> dct
'y': 2, 'x': 1, 'z': 3
>>> dct["y"]
2
You can use variable key names to achieve the effect of variable variables without the security risk.
>>> x = "spam"
>>> z = x: "eggs"
>>> z["spam"]
'eggs'
For cases where you're thinking of doing something like
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
a list may be more appropriate than a dict. A list represents an ordered sequence of objects, with integer indices:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
For ordered sequences, lists are more convenient than dicts with integer keys, because lists support iteration in index order, slicing, append
, and other operations that would require awkward key management with a dict.
add a comment
|
Use the built-in getattr
function to get an attribute on an object by name. Modify the name as needed.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
add a comment
|
It's not a good idea. If you are accessing a global variable you can use globals()
.
>>> a = 10
>>> globals()['a']
10
If you want to access a variable in the local scope you can use locals()
, but you cannot assign values to the returned dict.
A better solution is to use getattr
or store your variables in a dictionary and then access them by name.
add a comment
|
Whenever you want to use variable variables, it's probably better to use a dictionary. So instead of writing
$foo = "bar"
$$foo = "baz"
you write
mydict =
foo = "bar"
mydict[foo] = "baz"
This way you won't accidentally overwrite previously existing variables (which is the security aspect) and you can have different "namespaces".
add a comment
|
New coders sometimes write code like this:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
The coder is then left with a pile of named variables, with a coding effort of O(m * n), where m is the number of named variables and n is the number of times that group of variables needs to be accessed (including creation). The more astute beginner observes that the only difference in each of those lines is a number that changes based on a rule, and decides to use a loop. However, they get stuck on how to dynamically create those variable names, and may try something like this:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
They soon find that this does not work.
If the program requires arbitrary variable "names," a dictionary is the best choice, as explained in other answers. However, if you're simply trying to create many variables and you don't mind referring to them with a sequence of integers, you're probably looking for a list
. This is particularly true if your data are homogeneous, such as daily temperature readings, weekly quiz scores, or a grid of graphical widgets.
This can be assembled as follows:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
This list
can also be created in one line with a comprehension:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
The result in either case is a populated list
, with the first element accessed with my_calculator.buttons[0]
, the next with my_calculator.buttons[1]
, and so on. The "base" variable name becomes the name of the list
and the varying identifier is used to access it.
Finally, don't forget other data structures, such as the set
- this is similar to a dictionary, except that each "name" doesn't have a value attached to it. If you simply need a "bag" of objects, this can be a great choice. Instead of something like this:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
You will have this:
keywords = 'apple', 'banana'
if query in keywords:
print('Match.')
Use a list
for a sequence of similar objects, a set
for an arbitrarily-ordered bag of objects, or a dict
for a bag of names with associated values.
add a comment
|
Instead of a dictionary you can also use namedtuple
from the collections module, which makes access easier.
For example:
# using dictionary
variables =
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
add a comment
|
The SimpleNamespace
class could be used to create new attributes with setattr
, or subclass SimpleNamespace
and create your own function to add new attribute names (variables).
from types import SimpleNamespace
variables = "b":"B","c":"C"
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
add a comment
|
If you don't want to use any object, you can still use setattr()
inside your current module:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.
– Alexey
Jan 30 '18 at 18:25
globals()
can do this
– Guillaume Lebreton
Jan 31 '18 at 7:42
add a comment
|
You have to use globals()
built in method to achieve that behaviour:
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
add a comment
|
Use globals()
You can actually assign variables to global scope dynamically, for instance, if you want 10 variables that can be accessed on a global scope i_1
, i_2
... i_10
:
for i in range(10):
globals()['i_'.format(i)] = 'a'
This will assign 'a' to all of these 10 variables, of course you can change the value dynamically as well. All of these variables can be accessed now like other globally declared variable:
>>> i_5
'a'
add a comment
|
I'm am answering the question: How to get the value of a variable given its name in a string?
which is closed as a duplicate with a link to this question.
If the variables in question are part of an object (part of a class for example) then some useful functions to achieve exactly that are hasattr
, getattr
, and setattr
.
So for example you can have:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Then you can do:
v = Variables()
v.get_var("foo")
"initial_variable"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"is actually not initial"
add a comment
|
The consensus is to use a dictionary for this - see the other answers. This is a good idea for most cases, however, there are many aspects arising from this:
- you'll yourself be responsible for this dictionary, including garbage collection (of in-dict variables) etc.
- there's either no locality or globality for variable variables, it depends on the globality of the dictionary
- if you want to rename a variable name, you'll have to do it manually
- however, you are much more flexible, e.g.
- you can decide to overwrite existing variables or ...
- ... choose to implement const variables
- to raise an exception on overwriting for different types
- etc.
That said, I've implemented a variable variables manager-class which provides some of the above ideas. It works for python 2 and 3.
You'd use the class like this:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
If you wish to allow overwriting of variables with the same type only:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
add a comment
|
Any set of variables can also be wrapped up in a class.
"Variable" variables may be added to the class instance during runtime by directly accessing the built-in dictionary through __dict__ attribute.
The following code defines Variables class, which adds variables (in this case attributes) to its instance during the construction. Variable names are taken from a specified list (which, for example, could have been generated by program code):
# some list of variable names
L = ['a', 'b', 'c']
class Variables:
def __init__(self, L):
for item in L:
self.__dict__[item] = 100
v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
add a comment
|
protected by Bhargav Rao♦ Apr 21 '16 at 15:03
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
13 Answers
13
active
oldest
votes
13 Answers
13
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use dictionaries to accomplish this. Dictionaries are stores of keys and values.
>>> dct = 'x': 1, 'y': 2, 'z': 3
>>> dct
'y': 2, 'x': 1, 'z': 3
>>> dct["y"]
2
You can use variable key names to achieve the effect of variable variables without the security risk.
>>> x = "spam"
>>> z = x: "eggs"
>>> z["spam"]
'eggs'
For cases where you're thinking of doing something like
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
a list may be more appropriate than a dict. A list represents an ordered sequence of objects, with integer indices:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
For ordered sequences, lists are more convenient than dicts with integer keys, because lists support iteration in index order, slicing, append
, and other operations that would require awkward key management with a dict.
add a comment
|
You can use dictionaries to accomplish this. Dictionaries are stores of keys and values.
>>> dct = 'x': 1, 'y': 2, 'z': 3
>>> dct
'y': 2, 'x': 1, 'z': 3
>>> dct["y"]
2
You can use variable key names to achieve the effect of variable variables without the security risk.
>>> x = "spam"
>>> z = x: "eggs"
>>> z["spam"]
'eggs'
For cases where you're thinking of doing something like
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
a list may be more appropriate than a dict. A list represents an ordered sequence of objects, with integer indices:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
For ordered sequences, lists are more convenient than dicts with integer keys, because lists support iteration in index order, slicing, append
, and other operations that would require awkward key management with a dict.
add a comment
|
You can use dictionaries to accomplish this. Dictionaries are stores of keys and values.
>>> dct = 'x': 1, 'y': 2, 'z': 3
>>> dct
'y': 2, 'x': 1, 'z': 3
>>> dct["y"]
2
You can use variable key names to achieve the effect of variable variables without the security risk.
>>> x = "spam"
>>> z = x: "eggs"
>>> z["spam"]
'eggs'
For cases where you're thinking of doing something like
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
a list may be more appropriate than a dict. A list represents an ordered sequence of objects, with integer indices:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
For ordered sequences, lists are more convenient than dicts with integer keys, because lists support iteration in index order, slicing, append
, and other operations that would require awkward key management with a dict.
You can use dictionaries to accomplish this. Dictionaries are stores of keys and values.
>>> dct = 'x': 1, 'y': 2, 'z': 3
>>> dct
'y': 2, 'x': 1, 'z': 3
>>> dct["y"]
2
You can use variable key names to achieve the effect of variable variables without the security risk.
>>> x = "spam"
>>> z = x: "eggs"
>>> z["spam"]
'eggs'
For cases where you're thinking of doing something like
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
a list may be more appropriate than a dict. A list represents an ordered sequence of objects, with integer indices:
l = ['foo', 'bar', 'baz']
print(l[1]) # prints bar, because indices start at 0
l.append('potatoes') # l is now ['foo', 'bar', 'baz', 'potatoes']
For ordered sequences, lists are more convenient than dicts with integer keys, because lists support iteration in index order, slicing, append
, and other operations that would require awkward key management with a dict.
edited May 13 at 14:32
Georgy
3,0904 gold badges23 silver badges34 bronze badges
3,0904 gold badges23 silver badges34 bronze badges
answered Sep 3 '09 at 12:41
c_harmc_harm
add a comment
|
add a comment
|
Use the built-in getattr
function to get an attribute on an object by name. Modify the name as needed.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
add a comment
|
Use the built-in getattr
function to get an attribute on an object by name. Modify the name as needed.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
add a comment
|
Use the built-in getattr
function to get an attribute on an object by name. Modify the name as needed.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
Use the built-in getattr
function to get an attribute on an object by name. Modify the name as needed.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
edited Apr 21 '16 at 15:23
davidism
74.5k14 gold badges218 silver badges224 bronze badges
74.5k14 gold badges218 silver badges224 bronze badges
answered Sep 3 '09 at 12:43
SilentGhostSilentGhost
215k49 gold badges277 silver badges271 bronze badges
215k49 gold badges277 silver badges271 bronze badges
add a comment
|
add a comment
|
It's not a good idea. If you are accessing a global variable you can use globals()
.
>>> a = 10
>>> globals()['a']
10
If you want to access a variable in the local scope you can use locals()
, but you cannot assign values to the returned dict.
A better solution is to use getattr
or store your variables in a dictionary and then access them by name.
add a comment
|
It's not a good idea. If you are accessing a global variable you can use globals()
.
>>> a = 10
>>> globals()['a']
10
If you want to access a variable in the local scope you can use locals()
, but you cannot assign values to the returned dict.
A better solution is to use getattr
or store your variables in a dictionary and then access them by name.
add a comment
|
It's not a good idea. If you are accessing a global variable you can use globals()
.
>>> a = 10
>>> globals()['a']
10
If you want to access a variable in the local scope you can use locals()
, but you cannot assign values to the returned dict.
A better solution is to use getattr
or store your variables in a dictionary and then access them by name.
It's not a good idea. If you are accessing a global variable you can use globals()
.
>>> a = 10
>>> globals()['a']
10
If you want to access a variable in the local scope you can use locals()
, but you cannot assign values to the returned dict.
A better solution is to use getattr
or store your variables in a dictionary and then access them by name.
edited Apr 24 '17 at 2:03
Vallentin
12.3k4 gold badges36 silver badges55 bronze badges
12.3k4 gold badges36 silver badges55 bronze badges
answered Sep 3 '09 at 12:43
Nadia AlramliNadia Alramli
85.4k28 gold badges158 silver badges148 bronze badges
85.4k28 gold badges158 silver badges148 bronze badges
add a comment
|
add a comment
|
Whenever you want to use variable variables, it's probably better to use a dictionary. So instead of writing
$foo = "bar"
$$foo = "baz"
you write
mydict =
foo = "bar"
mydict[foo] = "baz"
This way you won't accidentally overwrite previously existing variables (which is the security aspect) and you can have different "namespaces".
add a comment
|
Whenever you want to use variable variables, it's probably better to use a dictionary. So instead of writing
$foo = "bar"
$$foo = "baz"
you write
mydict =
foo = "bar"
mydict[foo] = "baz"
This way you won't accidentally overwrite previously existing variables (which is the security aspect) and you can have different "namespaces".
add a comment
|
Whenever you want to use variable variables, it's probably better to use a dictionary. So instead of writing
$foo = "bar"
$$foo = "baz"
you write
mydict =
foo = "bar"
mydict[foo] = "baz"
This way you won't accidentally overwrite previously existing variables (which is the security aspect) and you can have different "namespaces".
Whenever you want to use variable variables, it's probably better to use a dictionary. So instead of writing
$foo = "bar"
$$foo = "baz"
you write
mydict =
foo = "bar"
mydict[foo] = "baz"
This way you won't accidentally overwrite previously existing variables (which is the security aspect) and you can have different "namespaces".
answered Sep 3 '09 at 12:42
sepp2ksepp2k
314k42 gold badges613 silver badges633 bronze badges
314k42 gold badges613 silver badges633 bronze badges
add a comment
|
add a comment
|
New coders sometimes write code like this:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
The coder is then left with a pile of named variables, with a coding effort of O(m * n), where m is the number of named variables and n is the number of times that group of variables needs to be accessed (including creation). The more astute beginner observes that the only difference in each of those lines is a number that changes based on a rule, and decides to use a loop. However, they get stuck on how to dynamically create those variable names, and may try something like this:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
They soon find that this does not work.
If the program requires arbitrary variable "names," a dictionary is the best choice, as explained in other answers. However, if you're simply trying to create many variables and you don't mind referring to them with a sequence of integers, you're probably looking for a list
. This is particularly true if your data are homogeneous, such as daily temperature readings, weekly quiz scores, or a grid of graphical widgets.
This can be assembled as follows:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
This list
can also be created in one line with a comprehension:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
The result in either case is a populated list
, with the first element accessed with my_calculator.buttons[0]
, the next with my_calculator.buttons[1]
, and so on. The "base" variable name becomes the name of the list
and the varying identifier is used to access it.
Finally, don't forget other data structures, such as the set
- this is similar to a dictionary, except that each "name" doesn't have a value attached to it. If you simply need a "bag" of objects, this can be a great choice. Instead of something like this:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
You will have this:
keywords = 'apple', 'banana'
if query in keywords:
print('Match.')
Use a list
for a sequence of similar objects, a set
for an arbitrarily-ordered bag of objects, or a dict
for a bag of names with associated values.
add a comment
|
New coders sometimes write code like this:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
The coder is then left with a pile of named variables, with a coding effort of O(m * n), where m is the number of named variables and n is the number of times that group of variables needs to be accessed (including creation). The more astute beginner observes that the only difference in each of those lines is a number that changes based on a rule, and decides to use a loop. However, they get stuck on how to dynamically create those variable names, and may try something like this:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
They soon find that this does not work.
If the program requires arbitrary variable "names," a dictionary is the best choice, as explained in other answers. However, if you're simply trying to create many variables and you don't mind referring to them with a sequence of integers, you're probably looking for a list
. This is particularly true if your data are homogeneous, such as daily temperature readings, weekly quiz scores, or a grid of graphical widgets.
This can be assembled as follows:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
This list
can also be created in one line with a comprehension:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
The result in either case is a populated list
, with the first element accessed with my_calculator.buttons[0]
, the next with my_calculator.buttons[1]
, and so on. The "base" variable name becomes the name of the list
and the varying identifier is used to access it.
Finally, don't forget other data structures, such as the set
- this is similar to a dictionary, except that each "name" doesn't have a value attached to it. If you simply need a "bag" of objects, this can be a great choice. Instead of something like this:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
You will have this:
keywords = 'apple', 'banana'
if query in keywords:
print('Match.')
Use a list
for a sequence of similar objects, a set
for an arbitrarily-ordered bag of objects, or a dict
for a bag of names with associated values.
add a comment
|
New coders sometimes write code like this:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
The coder is then left with a pile of named variables, with a coding effort of O(m * n), where m is the number of named variables and n is the number of times that group of variables needs to be accessed (including creation). The more astute beginner observes that the only difference in each of those lines is a number that changes based on a rule, and decides to use a loop. However, they get stuck on how to dynamically create those variable names, and may try something like this:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
They soon find that this does not work.
If the program requires arbitrary variable "names," a dictionary is the best choice, as explained in other answers. However, if you're simply trying to create many variables and you don't mind referring to them with a sequence of integers, you're probably looking for a list
. This is particularly true if your data are homogeneous, such as daily temperature readings, weekly quiz scores, or a grid of graphical widgets.
This can be assembled as follows:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
This list
can also be created in one line with a comprehension:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
The result in either case is a populated list
, with the first element accessed with my_calculator.buttons[0]
, the next with my_calculator.buttons[1]
, and so on. The "base" variable name becomes the name of the list
and the varying identifier is used to access it.
Finally, don't forget other data structures, such as the set
- this is similar to a dictionary, except that each "name" doesn't have a value attached to it. If you simply need a "bag" of objects, this can be a great choice. Instead of something like this:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
You will have this:
keywords = 'apple', 'banana'
if query in keywords:
print('Match.')
Use a list
for a sequence of similar objects, a set
for an arbitrarily-ordered bag of objects, or a dict
for a bag of names with associated values.
New coders sometimes write code like this:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
The coder is then left with a pile of named variables, with a coding effort of O(m * n), where m is the number of named variables and n is the number of times that group of variables needs to be accessed (including creation). The more astute beginner observes that the only difference in each of those lines is a number that changes based on a rule, and decides to use a loop. However, they get stuck on how to dynamically create those variable names, and may try something like this:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
They soon find that this does not work.
If the program requires arbitrary variable "names," a dictionary is the best choice, as explained in other answers. However, if you're simply trying to create many variables and you don't mind referring to them with a sequence of integers, you're probably looking for a list
. This is particularly true if your data are homogeneous, such as daily temperature readings, weekly quiz scores, or a grid of graphical widgets.
This can be assembled as follows:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
This list
can also be created in one line with a comprehension:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
The result in either case is a populated list
, with the first element accessed with my_calculator.buttons[0]
, the next with my_calculator.buttons[1]
, and so on. The "base" variable name becomes the name of the list
and the varying identifier is used to access it.
Finally, don't forget other data structures, such as the set
- this is similar to a dictionary, except that each "name" doesn't have a value attached to it. If you simply need a "bag" of objects, this can be a great choice. Instead of something like this:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
You will have this:
keywords = 'apple', 'banana'
if query in keywords:
print('Match.')
Use a list
for a sequence of similar objects, a set
for an arbitrarily-ordered bag of objects, or a dict
for a bag of names with associated values.
answered Aug 16 '16 at 10:41
TigerhawkT3TigerhawkT3
41k5 gold badges38 silver badges68 bronze badges
41k5 gold badges38 silver badges68 bronze badges
add a comment
|
add a comment
|
Instead of a dictionary you can also use namedtuple
from the collections module, which makes access easier.
For example:
# using dictionary
variables =
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
add a comment
|
Instead of a dictionary you can also use namedtuple
from the collections module, which makes access easier.
For example:
# using dictionary
variables =
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
add a comment
|
Instead of a dictionary you can also use namedtuple
from the collections module, which makes access easier.
For example:
# using dictionary
variables =
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
Instead of a dictionary you can also use namedtuple
from the collections module, which makes access easier.
For example:
# using dictionary
variables =
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
edited May 13 at 14:39
Georgy
3,0904 gold badges23 silver badges34 bronze badges
3,0904 gold badges23 silver badges34 bronze badges
answered Jun 22 '16 at 15:09
ojas mohrilojas mohril
1,3009 silver badges11 bronze badges
1,3009 silver badges11 bronze badges
add a comment
|
add a comment
|
The SimpleNamespace
class could be used to create new attributes with setattr
, or subclass SimpleNamespace
and create your own function to add new attribute names (variables).
from types import SimpleNamespace
variables = "b":"B","c":"C"
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
add a comment
|
The SimpleNamespace
class could be used to create new attributes with setattr
, or subclass SimpleNamespace
and create your own function to add new attribute names (variables).
from types import SimpleNamespace
variables = "b":"B","c":"C"
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
add a comment
|
The SimpleNamespace
class could be used to create new attributes with setattr
, or subclass SimpleNamespace
and create your own function to add new attribute names (variables).
from types import SimpleNamespace
variables = "b":"B","c":"C"
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
The SimpleNamespace
class could be used to create new attributes with setattr
, or subclass SimpleNamespace
and create your own function to add new attribute names (variables).
from types import SimpleNamespace
variables = "b":"B","c":"C"
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
edited May 24 at 13:22
Demi-Lune
7961 gold badge6 silver badges18 bronze badges
7961 gold badge6 silver badges18 bronze badges
answered Sep 17 '17 at 22:38
Bill OldroydBill Oldroyd
1791 silver badge4 bronze badges
1791 silver badge4 bronze badges
add a comment
|
add a comment
|
If you don't want to use any object, you can still use setattr()
inside your current module:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.
– Alexey
Jan 30 '18 at 18:25
globals()
can do this
– Guillaume Lebreton
Jan 31 '18 at 7:42
add a comment
|
If you don't want to use any object, you can still use setattr()
inside your current module:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.
– Alexey
Jan 30 '18 at 18:25
globals()
can do this
– Guillaume Lebreton
Jan 31 '18 at 7:42
add a comment
|
If you don't want to use any object, you can still use setattr()
inside your current module:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
If you don't want to use any object, you can still use setattr()
inside your current module:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
answered Oct 23 '17 at 19:24
Guillaume LebretonGuillaume Lebreton
8667 silver badges16 bronze badges
8667 silver badges16 bronze badges
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.
– Alexey
Jan 30 '18 at 18:25
globals()
can do this
– Guillaume Lebreton
Jan 31 '18 at 7:42
add a comment
|
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.
– Alexey
Jan 30 '18 at 18:25
globals()
can do this
– Guillaume Lebreton
Jan 31 '18 at 7:42
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This one sounds better to me than using 'exec'.
– fralau
Dec 30 '17 at 21:13
This does not work with
__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.– Alexey
Jan 30 '18 at 18:25
This does not work with
__dict__
variable however. I wonder if there is a general mechanism to create any global variable dynamically.– Alexey
Jan 30 '18 at 18:25
globals()
can do this– Guillaume Lebreton
Jan 31 '18 at 7:42
globals()
can do this– Guillaume Lebreton
Jan 31 '18 at 7:42
add a comment
|
You have to use globals()
built in method to achieve that behaviour:
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
add a comment
|
You have to use globals()
built in method to achieve that behaviour:
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
add a comment
|
You have to use globals()
built in method to achieve that behaviour:
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
You have to use globals()
built in method to achieve that behaviour:
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
edited Apr 24 '17 at 2:04
Vallentin
12.3k4 gold badges36 silver badges55 bronze badges
12.3k4 gold badges36 silver badges55 bronze badges
answered Jun 9 '16 at 12:14
Andriy IvaneykoAndriy Ivaneyko
11.7k3 gold badges26 silver badges45 bronze badges
11.7k3 gold badges26 silver badges45 bronze badges
add a comment
|
add a comment
|
Use globals()
You can actually assign variables to global scope dynamically, for instance, if you want 10 variables that can be accessed on a global scope i_1
, i_2
... i_10
:
for i in range(10):
globals()['i_'.format(i)] = 'a'
This will assign 'a' to all of these 10 variables, of course you can change the value dynamically as well. All of these variables can be accessed now like other globally declared variable:
>>> i_5
'a'
add a comment
|
Use globals()
You can actually assign variables to global scope dynamically, for instance, if you want 10 variables that can be accessed on a global scope i_1
, i_2
... i_10
:
for i in range(10):
globals()['i_'.format(i)] = 'a'
This will assign 'a' to all of these 10 variables, of course you can change the value dynamically as well. All of these variables can be accessed now like other globally declared variable:
>>> i_5
'a'
add a comment
|
Use globals()
You can actually assign variables to global scope dynamically, for instance, if you want 10 variables that can be accessed on a global scope i_1
, i_2
... i_10
:
for i in range(10):
globals()['i_'.format(i)] = 'a'
This will assign 'a' to all of these 10 variables, of course you can change the value dynamically as well. All of these variables can be accessed now like other globally declared variable:
>>> i_5
'a'
Use globals()
You can actually assign variables to global scope dynamically, for instance, if you want 10 variables that can be accessed on a global scope i_1
, i_2
... i_10
:
for i in range(10):
globals()['i_'.format(i)] = 'a'
This will assign 'a' to all of these 10 variables, of course you can change the value dynamically as well. All of these variables can be accessed now like other globally declared variable:
>>> i_5
'a'
answered Nov 27 '18 at 15:34
Rocky LiRocky Li
3,9591 gold badge8 silver badges19 bronze badges
3,9591 gold badge8 silver badges19 bronze badges
add a comment
|
add a comment
|
I'm am answering the question: How to get the value of a variable given its name in a string?
which is closed as a duplicate with a link to this question.
If the variables in question are part of an object (part of a class for example) then some useful functions to achieve exactly that are hasattr
, getattr
, and setattr
.
So for example you can have:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Then you can do:
v = Variables()
v.get_var("foo")
"initial_variable"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"is actually not initial"
add a comment
|
I'm am answering the question: How to get the value of a variable given its name in a string?
which is closed as a duplicate with a link to this question.
If the variables in question are part of an object (part of a class for example) then some useful functions to achieve exactly that are hasattr
, getattr
, and setattr
.
So for example you can have:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Then you can do:
v = Variables()
v.get_var("foo")
"initial_variable"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"is actually not initial"
add a comment
|
I'm am answering the question: How to get the value of a variable given its name in a string?
which is closed as a duplicate with a link to this question.
If the variables in question are part of an object (part of a class for example) then some useful functions to achieve exactly that are hasattr
, getattr
, and setattr
.
So for example you can have:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Then you can do:
v = Variables()
v.get_var("foo")
"initial_variable"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"is actually not initial"
I'm am answering the question: How to get the value of a variable given its name in a string?
which is closed as a duplicate with a link to this question.
If the variables in question are part of an object (part of a class for example) then some useful functions to achieve exactly that are hasattr
, getattr
, and setattr
.
So for example you can have:
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
Then you can do:
v = Variables()
v.get_var("foo")
"initial_variable"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"is actually not initial"
edited May 23 '17 at 12:10
Community♦
11 silver badge
11 silver badge
answered Nov 2 '16 at 15:53
patapouf_aipatapouf_ai
8,4128 gold badges56 silver badges97 bronze badges
8,4128 gold badges56 silver badges97 bronze badges
add a comment
|
add a comment
|
The consensus is to use a dictionary for this - see the other answers. This is a good idea for most cases, however, there are many aspects arising from this:
- you'll yourself be responsible for this dictionary, including garbage collection (of in-dict variables) etc.
- there's either no locality or globality for variable variables, it depends on the globality of the dictionary
- if you want to rename a variable name, you'll have to do it manually
- however, you are much more flexible, e.g.
- you can decide to overwrite existing variables or ...
- ... choose to implement const variables
- to raise an exception on overwriting for different types
- etc.
That said, I've implemented a variable variables manager-class which provides some of the above ideas. It works for python 2 and 3.
You'd use the class like this:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
If you wish to allow overwriting of variables with the same type only:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
add a comment
|
The consensus is to use a dictionary for this - see the other answers. This is a good idea for most cases, however, there are many aspects arising from this:
- you'll yourself be responsible for this dictionary, including garbage collection (of in-dict variables) etc.
- there's either no locality or globality for variable variables, it depends on the globality of the dictionary
- if you want to rename a variable name, you'll have to do it manually
- however, you are much more flexible, e.g.
- you can decide to overwrite existing variables or ...
- ... choose to implement const variables
- to raise an exception on overwriting for different types
- etc.
That said, I've implemented a variable variables manager-class which provides some of the above ideas. It works for python 2 and 3.
You'd use the class like this:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
If you wish to allow overwriting of variables with the same type only:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
add a comment
|
The consensus is to use a dictionary for this - see the other answers. This is a good idea for most cases, however, there are many aspects arising from this:
- you'll yourself be responsible for this dictionary, including garbage collection (of in-dict variables) etc.
- there's either no locality or globality for variable variables, it depends on the globality of the dictionary
- if you want to rename a variable name, you'll have to do it manually
- however, you are much more flexible, e.g.
- you can decide to overwrite existing variables or ...
- ... choose to implement const variables
- to raise an exception on overwriting for different types
- etc.
That said, I've implemented a variable variables manager-class which provides some of the above ideas. It works for python 2 and 3.
You'd use the class like this:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
If you wish to allow overwriting of variables with the same type only:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
The consensus is to use a dictionary for this - see the other answers. This is a good idea for most cases, however, there are many aspects arising from this:
- you'll yourself be responsible for this dictionary, including garbage collection (of in-dict variables) etc.
- there's either no locality or globality for variable variables, it depends on the globality of the dictionary
- if you want to rename a variable name, you'll have to do it manually
- however, you are much more flexible, e.g.
- you can decide to overwrite existing variables or ...
- ... choose to implement const variables
- to raise an exception on overwriting for different types
- etc.
That said, I've implemented a variable variables manager-class which provides some of the above ideas. It works for python 2 and 3.
You'd use the class like this:
from variableVariablesManager import VariableVariablesManager
myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])
# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
print("not allowed")
except AttributeError as e:
pass
# rename a variable
myVars.renameVariable('myconst', 'myconstOther')
# preserve locality
def testLocalVar():
myVars = VariableVariablesManager()
myVars['test'] = 13
print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])
# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
myVars = VariableVariablesManager()
print("inside function myVars['globalVar']:", myVars['globalVar'])
myVars['globalVar'] = 13
print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])
If you wish to allow overwriting of variables with the same type only:
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
edited Jun 9 '16 at 12:10
answered Jun 9 '16 at 11:47
DomTomCatDomTomCat
4,8101 gold badge31 silver badges49 bronze badges
4,8101 gold badge31 silver badges49 bronze badges
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
add a comment
|
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
At first glance the long camelised imports made me think this was Java.
– markroxor
Feb 19 '18 at 6:17
add a comment
|
Any set of variables can also be wrapped up in a class.
"Variable" variables may be added to the class instance during runtime by directly accessing the built-in dictionary through __dict__ attribute.
The following code defines Variables class, which adds variables (in this case attributes) to its instance during the construction. Variable names are taken from a specified list (which, for example, could have been generated by program code):
# some list of variable names
L = ['a', 'b', 'c']
class Variables:
def __init__(self, L):
for item in L:
self.__dict__[item] = 100
v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
add a comment
|
Any set of variables can also be wrapped up in a class.
"Variable" variables may be added to the class instance during runtime by directly accessing the built-in dictionary through __dict__ attribute.
The following code defines Variables class, which adds variables (in this case attributes) to its instance during the construction. Variable names are taken from a specified list (which, for example, could have been generated by program code):
# some list of variable names
L = ['a', 'b', 'c']
class Variables:
def __init__(self, L):
for item in L:
self.__dict__[item] = 100
v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
add a comment
|
Any set of variables can also be wrapped up in a class.
"Variable" variables may be added to the class instance during runtime by directly accessing the built-in dictionary through __dict__ attribute.
The following code defines Variables class, which adds variables (in this case attributes) to its instance during the construction. Variable names are taken from a specified list (which, for example, could have been generated by program code):
# some list of variable names
L = ['a', 'b', 'c']
class Variables:
def __init__(self, L):
for item in L:
self.__dict__[item] = 100
v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
Any set of variables can also be wrapped up in a class.
"Variable" variables may be added to the class instance during runtime by directly accessing the built-in dictionary through __dict__ attribute.
The following code defines Variables class, which adds variables (in this case attributes) to its instance during the construction. Variable names are taken from a specified list (which, for example, could have been generated by program code):
# some list of variable names
L = ['a', 'b', 'c']
class Variables:
def __init__(self, L):
for item in L:
self.__dict__[item] = 100
v = Variables(L)
print(v.a, v.b, v.c)
#will produce 100 100 100
answered Aug 11 '17 at 21:13
Alexey RodimovAlexey Rodimov
775 bronze badges
775 bronze badges
add a comment
|
add a comment
|
protected by Bhargav Rao♦ Apr 21 '16 at 15:03
Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?
25
it's the maintainance and debugging aspects that cause the horror. Imagine trying to find out where variable 'foo' changed when there's no place in your code where you actually change 'foo'. Imagine further that it's someone else's code that you have to maintain... OK, you can go to your happy place now.
– glenn jackman
Sep 3 '09 at 14:28
3
A further pitfall that hasn't been mentioned so far is if such a dynamically-created variable has the same name as a variable used in your logic. You essentially open up your software as a hostage to the input it is given.
– holdenweb
Dec 19 '14 at 10:50
All the responses here assume you have access to the base variables you want to access dynamically by name, which is not always the case. I think the most general approach to reproduce the example behaviour in PHP is to use eval() like this: var_name = 'foo'; bar = 5; output = eval(var_name)
– Luis Vazquez
Oct 23 at 17:18