为什么共享的价值没有改变?

时间:2019-02-23 22:31:39

标签: python python-3.x

我希望能够传递一个变量(在这种情况下称为共享变量)并更改其值。我以为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()

3 个答案:

答案 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/可帮助您了解正在发生的事情: vars pointing at values