我希望能够传递一个变量(在这种情况下称为共享变量)并更改其值。我以为python中的所有参数都是通过引用传递的,所以我不确定为什么它不起作用。
class a:
def __init__(self, x):
self.block = x
def callb(self, shared = "notright"):
print("in a")
print("shared before: " + shared)
self.block.callb(self, shared)
print("shared after: " + shared)
class b:
def callb(self, a, shared):
print("b was called")
shared = "yay!"
print("shared in b: " + shared)
new = a(b())
new.callb()
答案 0 :(得分:0)
这与“局部”和“全局”变量的概念有关。 在Python中,在循环,函数,类或方法内部声明的每个变量都是 local 变量(除非明确指定),这意味着变量是在特定的代码段内生成和死亡的。 / p>
当您在shared
中收到b.callb
作为输入时,您只是用别的东西写了它,并且因为您没有return
在任何地方写它,它就死了b.callb
结束课程后。
要获得所需的信息,可以将shared
声明为全局变量(不建议使用全局变量tho,因为它们可能很难管理),或者只需在{{ 1}},并在shared
中调用b.callb
时再次声明shared
类似的作品:
b.callb
(请注意,a.callb
现在仅以class a:
def __init__(self, x):
self.block = x
def callb(self, shared = "notright"):
print("in a")
print("shared before: " + shared)
shared = self.block.callb(shared)
print("shared after: " + shared)
class b:
def callb(self, shared):
print("b was called")
shared = "yay!"
print("shared in b: " + shared)
return shared
new = a(b())
new.callb()
Output:
in a
shared before: notright
b was called
shared in b: yay!
shared after: yay!
作为参数,因为将b.callb
传递给它并没有任何实际用途)
答案 1 :(得分:0)
在这一行:
shared = "yay!"
您正在更改shared
本地的b.callb
标识符,以指向新的字符串。在此表达式之后,shared
中的b.callb
指向的字符串与shared
中的a.callb
标识符所指向的字符串不同。
由于string
类型在Python中是不可变的,因此除了使用可传递的可变对象之外,您将无法实现所需的目标。
将数据包装为可变类型的示例,因此您可以修改将其从标识符传递给另一个标识符的方法:
class s:
def __init__(self, shared):
self.data = shared
def set(self, shared):
self.data = shared
class a:
def __init__(self, x):
self.block = x
def callb(self, shared = s("notright")):
print("in a")
print("shared before: " + shared.data)
self.block.callb(self, shared)
print("shared after: " + shared.data)
class b:
def callb(self, a, shared):
print("b was called")
shared.set("yay!")
print("shared in b: " + shared.data)
new = a(b())
new.callb()
答案 2 :(得分:0)
您两次向局部变量分配了一个不变的example_request = pool_manager.request("GET", "https://example.com", headers = {
"Header1": "value1",
"Header2": "value2"
})
(例如str
)。
传递一些可变的数据结构,例如'yay!'
或list
会更快乐。然后您可以分配一个新的字符串,例如列出元素dict
或字典条目x[0]
。
您可能会发现http://pythontutor.com/可帮助您了解正在发生的事情: