【问题标题】:Global Variable becomes local全局变量成为局部变量
【发布时间】:2023-01-05 23:01:20
【问题描述】:

如果标题有点含糊(我不知道如何将我的问题放在一个标题中),请在此处进行解释。

我有一个全局变量

ex = False
orig = id(ex)

然后,我有两个功能:

def start(test):
   print("Start")
   global ex
   while True:
       if id(ex) == orig:
       print("same")
   else:
       print(orig)
       print(id(ex))

def end(test):
   print("End")
   global ex
   ex = True
   while True:
       if id(ex) == orig:
       print("same")
   else:
       print(orig)
       print(id(ex))

当我进入“end-function”时,函数中“ex”的id与原来的id不一样。所以,它们基本上是两个不同的变量。

我不明白为什么会这样。我的意思是,我知道它会发生,因为我确实设置了“ex = True”(因为如果我跳过这一行,id 是相同的)。但我不明白为什么。我认为 global 关键字的想法正是使在函数内设置全局变量成为可能。 Using global variables in a function

【问题讨论】:

  • 变量没有 ID。对象有 ID。看到不同对象的不同 ID 是完全正常的。
  • 看起来你正在尝试做的事情应该在课堂上完成。因此,您可以拥有具有方法开始和结束的类的不同实例。你能解释一下你想要达到的目标吗?
  • @user2357112 一切都是 python 中的对象....
  • @SkoboDo:“一切”是一个误导性的宽泛术语。当人们说“一切都是对象”时,他们的意思是 Python 没有非对象的“原始”类型。这并不意味着变量是对象。
  • 你得到身份证1 对象的,而不是 x 变量的 ID。

标签: python function global local


【解决方案1】:

问题是布尔值是不互惠的。因此,当您更改全局变量时,它指向不同的对象。您可以轻松模拟:

>>> b=True
>>> id(b)
140715296352080
>>> b=False
>>> id(b)
140715296352112
>>> id(True)
140715296352080
>>> id(False)
140715296352112

如果您的变量是相互类型的并且您更改了其中的值,则它不会更改 id。在下面的示例中,我在 bool 周围放置了一个包装器

>>> class MyBool():
...   val = False
...
>>> mb = MyBool()
>>> def foo():
...   global mb
...   print(id(mb))
...   mb.val = True
...   print(id(mb))
...
>>> foo()
2359703595472
2359703595472

并且变量的 id 保持不变。

通常,在 python 中变量指向全局或本地存储中的对象。当您更改变量的“值”时,您需要区分可变类型和不可变类型。

  1. 当类型可变时:变量指向的内存中的值发生变化。
  2. 当不可变时:指针本身更改为包含新值的内存位置,同时保持旧值不变。

【讨论】:

  • 这实际上与可变性没有任何关系;名字的赋值绝不更改值,仅更改名称所指的值。
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多