변수 작성 방법
Python에서 PHP 변수 이름과 동등한 이름을 만들려면 어떻게 해야 합니까?
하지만 전반적으로 좋지 않은 생각이라고 들었습니다.진짜예요?
기존 변수를 이름으로 검색하려고 할 경우 How do I select a variable by (string) name을 참조하십시오.다만, 우선, 이 질문의 어드바이스에 따라서, 그러한 요구를 회피하기 위해서 코드를 재구성할 수 있는지를 검토해 주세요.
사전을 사용하여 이 작업을 수행할 수 있습니다.사전은 키와 값의 저장소입니다.
>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2
변수 키 이름을 사용하면 보안 위험 없이 변수 효과를 얻을 수 있습니다.
>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'
예를 들어 다음과 같은 일을 할 생각이 있는 경우
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
목록이 딕트보다 더 적절할 수 있습니다.목록은 개체의 순서를 정수 인덱스로 나타냅니다.
lst = ['foo', 'bar', 'baz']
print(lst[1]) # prints bar, because indices start at 0
lst.append('potatoes') # lst is now ['foo', 'bar', 'baz', 'potatoes']
순서가 매겨진 시퀀스의 경우 리스트는 정수 키를 가진 딕트보다 편리합니다.목록은 인덱스 순서에서의 반복, 슬라이스,append
'dict'는 'dict'를 말합니다.
내장된 함수를 사용하여 오브젝트의 속성을 이름으로 가져옵니다.필요에 따라서 이름을 변경합니다.
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
좋은 생각이 아니다.글로벌 변수에 액세스하는 경우 를 사용할 수 있습니다.
>>> a = 10
>>> globals()['a']
10
로컬 스코프의 변수에 액세스하려면 를 사용할 수 있지만 반환된 dict에는 값을 할당할 수 없습니다.
보다 나은 해결책은getattr
또는 사전에 변수를 저장한 다음 이름으로 액세스합니다.
새로운 코드 작성자는 다음과 같은 코드를 작성할 수 있습니다.
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)
...
그런 다음 코드화 작업 O(m * n)로 명명된 변수 더미가 코드화됩니다. 여기서 m은 명명된 변수의 수이고 n은 변수 그룹에 액세스해야 하는 횟수입니다(생성 포함).보다 예리한 초심자는 이러한 각 행의 유일한 차이는 규칙에 따라 변화하는 숫자라는 것을 깨닫고 루프를 사용하기로 결정합니다.다만, 이러한 변수명을 동적으로 작성하는 방법에 얽매여, 다음과 같은 시도를 할 수 있습니다.
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
그들은 곧 이것이 효과가 없다는 것을 알게 된다.
프로그램에 임의 변수 "이름"이 필요한 경우 다른 답변에서 설명한 바와 같이 사전이 최선의 선택입니다., 정수의 은 아마도 '다음에 있다'를 입니다.list
일별 온도 측정치, 주별 퀴즈 점수, 그래픽 위젯 그리드 등 데이터가 동종인 경우 특히 그렇습니다.
이것은 다음과 같이 조립할 수 있습니다.
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
★★★★★★★★★★★★★★★★★.list
또한 이해를 통해 한 줄에 작성할 수 있습니다.
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
결과는 로 채워진다.list
첫 번째 요소는 를 사용하여 접근합니다.my_calculator.buttons[0]
에는 을 붙입니다.my_calculator.buttons[1]
기본 기본 변수 이 됩니다.list
다양한 식별자를 사용하여 액세스합니다.
마지막으로, 이 를 들어 '아까보다'와 자료 도 잊지 마세요.set
'에 않는다는 - '이름'에 가치가 붙지 않는다.단순히 "가방"의 객체가 필요한 경우, 이는 훌륭한 선택이 될 수 있습니다.'이것'은 다음과 같습니다.
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
다음과 같이 됩니다.
keywords = {'apple', 'banana'}
if query in keywords:
print('Match.')
사용하다list
는, 「」라고 하는 것.set
임의로 순서가 매겨진 물건의 가방, 또는dict
련련 、 값함함포포경 경방경경 。
변수 변수를 사용하려면 사전을 사용하는 것이 좋습니다.그래서 글을 쓰는 대신
$foo = "bar"
$$foo = "baz"
너는 글을 쓴다
mydict = {}
foo = "bar"
mydict[foo] = "baz"
이렇게 하면 기존 변수(보안 측면)를 실수로 덮어쓰지 않고 다른 "네임스페이스"를 가질 수 있습니다.
globals()
(설문: 이것은 잘못된 관행이지만, 당신의 질문에 대한 가장 간단한 답변입니다.허용된 답변과 같이 다른 데이터 구조를 사용해 주십시오.
수할 수 .i_1
,i_2
i_10
:
for i in range(10):
globals()['i_{}'.format(i)] = 'a'
이렇게 하면 이들 10개 변수 모두에 'a'가 할당됩니다.물론 동적으로 값을 변경할 수도 있습니다.글로벌하게 선언된 다른 변수와 마찬가지로 다음 모든 변수에 액세스할 수 있습니다.
>>> i_5
'a'
사전 대신 컬렉션 모듈에서 사용할 수도 있습니다. 이렇게 하면 액세스가 더 쉬워집니다.
예를 들어 다음과 같습니다.
# 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)
클래스는 새로운 Atribute를 만들기 위해 사용할 수 있습니다.setattr
서브클래스 " " " " " "SimpleNamespace
자체 함수를 생성하여 새 속성 이름(예:)을 추가합니다.
from types import SimpleNamespace
variables = {"b":"B","c":"C"}
a = SimpleNamespace(**variables)
setattr(a,"g","G")
a.g = "G+"
something = a.a
오브젝트도 않은 할 수 .setattr()
"이것들"은 다음과 같습니다.
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
이 동작을 실현하려면 , 빌트인 방식을 사용할 필요가 있습니다.
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
질문에 대답하는 겁니다.문자열에 지정된 변수 이름을 가져오려면 어떻게 해야 합니까?이 질문의 링크와 중복으로 닫힙니다.
문제의 변수가 객체의 일부(예를 들어 클래스의 일부)인 경우 다음과 같은 기능을 수행하는 데 도움이 되는 함수는 다음과 같습니다.hasattr
,getattr
, , , , 입니다.setattr
예를 들어 다음과 같은 것이 있습니다.
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)
다음 작업을 수행할 수 있습니다.
v = Variables()
v.get_var("foo")
"initial_interial"
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
"실제로 첫 번째가 아닙니다"
# Python 3.8.2 (default, Feb 26 2020, 02:56:10)
Python 변수
"""
<?php
$a = 'hello';
$e = 'wow'
?>
<?php
$$a = 'world';
?>
<?php
echo "$a ${$a}\n";
echo "$a ${$a[1]}\n";
?>
<?php
echo "$a $hello";
?>
"""
a = 'hello' #<?php $a = 'hello'; ?>
e = 'wow' #<?php $e = 'wow'; ?>
vars()[a] = 'world' #<?php $$a = 'world'; ?>
print(a, vars()[a]) #<?php echo "$a ${$a}\n"; ?>
print(a, vars()[vars()['a'][1]]) #<?php echo "$a ${$a[1]}\n"; ?>
print(a, hello) #<?php echo "$a $hello"; ?>
출력:
hello world
hello wow
hello world
globals(), locals() 또는 vars()를 사용해도 동일한 결과가 생성됩니다.
# Python 3.8.2 (default, Feb 26 2020, 02:56:10)
#<?php $a = 'hello'; ?>
#<?php $e = 'wow'; ?>
#<?php $$a = 'world'; ?>
#<?php echo "$a ${$a}\n"; ?>
#<?php echo "$a ${$a[1]}\n"; ?>
#<?php echo "$a $hello"; ?>
print('locals():\n')
a = 'hello'
e = 'wow'
locals()[a] = 'world'
print(a, locals()[a])
print(a, locals()[locals()['a'][1]])
print(a, hello)
print('\n\nglobals():\n')
a = 'hello'
e = 'wow'
globals()[a] = 'world'
print(a, globals()[a])
print(a, globals()[globals()['a'][1]])
print(a, hello)
출력:
locals():
hello world
hello wow
hello world
globals():
hello world
hello wow
hello world
보너스(문자열에서 변수 생성)
# Python 2.7.16 (default, Jul 13 2019, 16:01:51)
# [GCC 8.3.0] on linux2
변수 생성 및 태플 풀기:
g = globals()
listB = []
for i in range(10):
g["num%s" % i] = i ** 10
listB.append("num{0}".format(i))
def printNum():
print "Printing num0 to num9:"
for i in range(10):
print "num%s = " % i,
print g["num%s" % i]
printNum()
listA = []
for i in range(10):
listA.append(i)
listA = tuple(listA)
print listA, '"Tuple to unpack"'
listB = str(str(listB).strip("[]").replace("'", "") + " = listA")
print listB
exec listB
printNum()
출력:
Printing num0 to num9:
num0 = 0
num1 = 1
num2 = 1024
num3 = 59049
num4 = 1048576
num5 = 9765625
num6 = 60466176
num7 = 282475249
num8 = 1073741824
num9 = 3486784401
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) "Tuple to unpack"
num0, num1, num2, num3, num4, num5, num6, num7, num8, num9 = listA
Printing num0 to num9:
num0 = 0
num1 = 1
num2 = 2
num3 = 3
num4 = 4
num5 = 5
num6 = 6
num7 = 7
num8 = 8
num9 = 9
python 3.7.3에서 둘 다 시도해 봤는데 globals() 또는 vars() 중 하나를 사용할 수 있습니다.
>>> food #Error
>>> milkshake #Error
>>> food="bread"
>>> drink="milkshake"
>>> globals()[food] = "strawberry flavor"
>>> vars()[drink] = "chocolate flavor"
>>> bread
'strawberry flavor'
>>> milkshake
'chocolate flavor'
>>> globals()[drink]
'chocolate flavor'
>>> vars()[food]
'strawberry flavor'
이에 대해서는 사전을 사용하기로 합의했습니다. 다른 답을 참조하십시오.이것은 대부분의 경우 좋은 생각입니다만, 이것으로부터 생기는 여러가지 측면이 있습니다.
- 가비지 컬렉션 등 이 딕셔너리에 대한 책임은 사용자에게 있습니다.
- 변수 변수에는 지역성 또는 전역성이 없습니다. 사전의 전역성에 따라 다릅니다.
- 변수 이름을 변경하려면 수동으로 변경해야 합니다.
- 하지만, 당신은 훨씬 더 유연합니다.
- 기존 변수를 덮어쓸지 여부를 결정할 수 있습니다.
- ... const 변수 구현 선택
- 다른 종류의 덮어쓰기에 대해 예외를 두다
- 기타.
즉, 위의 아이디어 중 일부를 제공하는 변수 관리자 클래스를 구현했습니다.python 2와 3에서 동작합니다.
수업은 다음과 같이 사용할 수 있습니다.
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'])
같은 유형의 변수만 덮어쓸 수 있도록 하려면 다음 절차를 수행합니다.
myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)
모든 변수 집합을 클래스로 정리할 수도 있습니다.__dict__ 속성을 통해 빌트인 사전에 직접 액세스하여 런타임 중에 클래스 인스턴스에 변수를 추가할 수 있습니다.
다음 코드는 변수 클래스를 정의하며, 이 경우 구성 중에 해당 인스턴스에 변수(이 경우 속성)를 추가합니다.변수 이름은 지정된 목록에서 가져옵니다(예: 프로그램 코드로 생성되었을 수 있음).
# 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
아주 위험할 거야...exec()을 사용할 수 있습니다.
a = 'b=5'
exec(a)
c = b*2
print (c)
결과: 10
setattr() 메서드는 지정된 객체의 지정된 속성 값을 설정합니다.
구문은 다음과 같습니다.
setattr(object, name, value)
Example –
setattr(self,id,123)
은 와와다다 which에 해당합니다.self.id = 123
관찰한 바와 같이 setattr()에서는 새로운 Atribute를 생성 또는 변경하기 위해 객체가 값과 함께 전달될 것으로 예상합니다.
setattr()를 회피책과 함께 사용하면 모듈 내에서 사용할 수 있습니다.여기 방법 –
import sys
x = "pikachu"
value = 46
thismodule = sys.modules[__name__]
setattr(thismodule, x, value)
print(pikachu)
언급URL : https://stackoverflow.com/questions/1373164/how-do-i-create-variable-variables
'source' 카테고리의 다른 글
MySQL의 "주요 효율성"이란 (0) | 2022.11.14 |
---|---|
계산 필드를 vuex-map-fields로 매핑합니다. (0) | 2022.11.14 |
모든 서브플롯에 대해 하나의 색상 막대를 갖는 방법 (0) | 2022.11.14 |
PPDoc: @return void가 필요합니까? (0) | 2022.11.14 |
Java 인터페이스 방식을 추상화라고 선언하는 이유는 무엇입니까? (0) | 2022.11.14 |