변수를 동적으로 작성하려면 어떻게 해야 합니까?
Python에서 동적으로 변수를 만들고 싶습니다.이걸 할 수 있는 창의적인 방법이 있나요?
변수 이름을 복잡하게 만들 필요가 없는 한 사전을 사용하면 키 이름을 동적으로 만들고 각 변수 이름에 값을 연결할 수 있습니다.
a = {}
k = 0
while k < 10:
# dynamically create key
key = ...
# calculate value
value = ...
a[key] = value
k += 1
모듈에는 적용할 수 있는 몇 가지 흥미로운 데이터 구조도 있습니다.
globals() 모듈 변수 사전을 반환합니다.사전에서 키를 생성하여 새 변수를 만들 수 있습니다.
# By default, a module has some hidden variables defined
print({k: v for k, v in globals().items() if not k.startswith("__")})
for i in range(1, 11):
globals()[f"my_variable_{i}"] = i
print()
print(my_variable_1)
print(my_variable_2)
# and so on
print()
print({k: v for k, v in globals().items() if not k.startswith("__")})
결과:
{}
1
2
{'i': 10, 'my_variable_1': 1, 'my_variable_2': 2, 'my_variable_3': 3, 'my_variable_4': 4, 'my_variable_5': 5, 'my_variable_6': 6, 'my_variable_7': 7, 'my_variable_8': 8, 'my_variable_9': 9, 'my_variable_10': 10}
메서드를 사용하여 임의 코드를 실행합니다.예를 들어, 사전이 있고 각 키를 원래 사전 값을 가진 변수로 변환하려면 다음을 수행할 수 있습니다.
>>> c = {"one": 1, "two": 2}
>>> for k, v in c.items():
... exec(f"{k} = {v}")
...
>>> one
1
>>> two
2
글로벌 네임스페이스나 로컬 네임스페이스에 정보를 넣는 것은 좋지 않습니다.dict를 사용하는 것은 다른 언어처럼... d['constant-key'] = value어색해 보여요.Python은 OO입니다.명인의 말을 빌리자면, 「네임스페이스는 경적을 울리는 좋은 아이디어입니다.그것들을 더 해 봅시다!"""
다음과 같이 합니다.
>>> class Record(object):
... pass
...
>>> r = Record()
>>> r.foo = 'oof'
>>> setattr(r, 'bar', 'rab')
>>> r.foo
'oof'
>>> r.bar
'rab'
>>> names = 'id description price'.split()
>>> values = [666, 'duct tape', 3.45]
>>> s = Record()
>>> for name, value in zip(names, values):
... setattr(s, name, value)
...
>>> s.__dict__ # If you are suffering from dict withdrawal symptoms
{'price': 3.45, 'id': 666, 'description': 'duct tape'}
>>>
vars()['meta_anio_2012'] = 'translate'
키워드 파라미터를 사용하면 어떤 함수에서 다른 함수로 변수를 전달할 수 있습니다.이 방법으로 사전의 키를 변수 이름으로 사용할 수 있습니다(이 키는 다음 항목에 입력 가능).whileloop) 사전 이름 앞에만 있으면 됩니다.**라고 불릴 때.
# create a dictionary
>>> kwargs = {}
# add a key of name and assign it a value, later we'll use this key as a variable
>>> kwargs['name'] = 'python'
# an example function to use the variable
>>> def print_name(name):
... print name
# call the example function
>>> print_name(**kwargs)
python
없이.**,kwargs는 사전일 뿐입니다.
>>> print_name(kwargs)
{'name': 'python'}
메모: 이는 실제 답변이 아닌 논의로 간주해야 합니다.
대략적인 접근법은 다음과 같습니다.__main__모듈 내에서 변수를 만듭니다.예를 들어,b.py:
#!/usr/bin/env python
# coding: utf-8
def set_vars():
import __main__
print '__main__', __main__
__main__.B = 1
try:
print B
except NameError as e:
print e
set_vars()
print 'B: %s' % B
실행 시 출력됩니다.
$ python b.py
name 'B' is not defined
__main__ <module '__main__' from 'b.py'>
B: 1
단, 이 접근방식은 단일 모듈스크립트만으로 동작합니다.__main__Import는 항상 python에 의해 실행되는 엔트리 스크립트의 모듈을 나타냅니다.이것은, 다음의 경우에,b.py다른 코드와 관련되어 있습니다.B변수는 in이 아닌 intry 스크립트의 범위에서 생성됩니다.b.py그 자체입니다.스크립트가 있다고 가정합니다.a.py:
#!/usr/bin/env python
# coding: utf-8
try:
import b
except NameError as e:
print e
print 'in a.py: B', B
실행 시 출력됩니다.
$ python a.py
name 'B' is not defined
__main__ <module '__main__' from 'a.py'>
name 'B' is not defined
in a.py: B 1
주의:__main__로 변경되었습니다.'a.py'.
프리돔의 경우:
import random
alphabet = tuple('abcdefghijklmnopqrstuvwxyz')
globkeys = globals().keys()
globkeys.append('globkeys') # because name 'globkeys' is now also in globals()
print 'globkeys==',globkeys
print
print "globals().keys()==",globals().keys()
for i in xrange(8):
globals()[''.join(random.sample(alphabet,random.randint(3,26)))] = random.choice(alphabet)
del i
newnames = [ x for x in globals().keys() if x not in globkeys ]
print
print 'newnames==',newnames
print
print "globals().keys()==",globals().keys()
print
print '\n'.join(repr((u,globals()[u])) for u in newnames)
결과
globkeys== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', '__doc__', 'globkeys']
globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', '__name__', 'globkeys', '__doc__']
newnames== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'kbutmzfgpcdqanrivwsxly', 'lxzmaysuornvdpjqfetbchgik', 'wznptbyermclfdghqxjvki', 'lwg', 'vsolxgkz', 'yobtlkqh']
globals().keys()== ['fztkebyrdwcigsmulnoaph', 'umkfcvztleoij', 'newnames', 'kbutmzfgpcdqanrivwsxly', '__builtins__', 'alphabet', 'random', 'lxzmaysuornvdpjqfetbchgik', '__package__', 'wznptbyermclfdghqxjvki', 'lwg', 'x', 'vsolxgkz', '__name__', 'globkeys', '__doc__', 'yobtlkqh']
('fztkebyrdwcigsmulnoaph', 't')
('umkfcvztleoij', 'p')
('kbutmzfgpcdqanrivwsxly', 'a')
('lxzmaysuornvdpjqfetbchgik', 'n')
('wznptbyermclfdghqxjvki', 't')
('lwg', 'j')
('vsolxgkz', 'w')
('yobtlkqh', 'c')
다른 방법:
import random
pool_of_names = []
for i in xrange(1000):
v = 'LXM'+str(random.randrange(10,100000))
if v not in globals():
pool_of_names.append(v)
alphabet = 'abcdefghijklmnopqrstuvwxyz'
print 'globals().keys()==',globals().keys()
print
for j in xrange(8):
globals()[pool_of_names[j]] = random.choice(alphabet)
newnames = pool_of_names[0:j+1]
print
print 'globals().keys()==',globals().keys()
print
print '\n'.join(repr((u,globals()[u])) for u in newnames)
결과:
globals().keys()== ['__builtins__', 'alphabet', 'random', '__package__', 'i', 'v', '__name__', '__doc__', 'pool_of_names']
globals().keys()== ['LXM7646', 'random', 'newnames', 'LXM95826', 'pool_of_names', 'LXM66380', 'alphabet', 'LXM84070', '__package__', 'LXM8644', '__doc__', 'LXM33579', '__builtins__', '__name__', 'LXM58418', 'i', 'j', 'LXM24703', 'v']
('LXM66380', 'v')
('LXM7646', 'a')
('LXM8644', 'm')
('LXM24703', 'r')
('LXM58418', 'g')
('LXM84070', 'c')
('LXM95826', 'e')
('LXM33579', 'j')
언급URL : https://stackoverflow.com/questions/5036700/how-can-you-dynamically-create-variables
'source' 카테고리의 다른 글
| jQuery는 JavaScript의 addEventListener 메서드에 상당합니다. (0) | 2023.01.16 |
|---|---|
| python은 Java Class.forName()과 동등합니까? (0) | 2023.01.16 |
| PDO 준비 문에서 원시 SQL 쿼리 문자열을 가져오는 중 (0) | 2023.01.16 |
| mariadb 출력에 대시가 너무 많습니다. (0) | 2023.01.16 |
| MariaDB Virtual Columns - 해시를 얻을 수 있습니까? (0) | 2023.01.16 |