【问题标题】:Does an internal variable have more priority than a global variable?内部变量是否比全局变量具有更高的优先级?
【发布时间】:2020-10-10 16:49:01
【问题描述】:

我发现了一个关于内部变量的奇怪代码,我不明白它的行为:

artist = "ABBA"

def printer(artist):
    global internal_var 
    internal_var= "Queen"
    print(artist,"is an artist")

internal_var = "U2" # I added this line

printer(artist) 
printer(internal_var) # I thought this would be "U2" ...

print(internal_var) # I added this line; I thought this would be "U2" ...

输出是:

ABBA is an artist
Queen is an artist
Queen

我完全糊涂了。
首先,为什么这不会导致冲突?
其次,为什么internal_var不被覆盖?
三、如何覆盖internal_var

我认为它在一定程度上是有用的,但它会产生更多的错误。

请告诉我这个问题是否重复。
(我找不到任何类似的问题。)
提前谢谢你。

【问题讨论】:

  • 我建议你把你的代码python tutor 看一步一步会发生什么。
  • 为什么您认为将"Queen" 分配给internal_var 不会将"Queen" 分配给internal_var
  • 声明一个全局变量使其成为非“内部”(“内部”可能是指“本地”)。
  • @Asocia 谢谢,非常有用。我用结果来继续这个讨论。
  • @MichaelButscher 你能详细说明一下吗? (顺便说一句,该网站将其介绍为"internal variable"。)

标签: python variables conflict overwrite


【解决方案1】:

在代码中添加了几个 cmets,使其工作方式更加清晰:

artist = "ABBA"

def printer(artist):
    global internal_var 
    internal_var= "Queen"
    print(artist,"is an artist")

internal_var = "U2" # I added this line; this line define global variable internal_var and set "U2"  
# note till this point we have two global variables as: (1) artist="ABBA" and  (2) internal_var= "U2"
print(internal_var) # display "U2" 

printer(artist) # internal_var is changed by printer to "Queen" because using global inside printer as "global internal_var" means you are referring to global variable internal_var.  
print(internal_var) # display "Queen"

printer(internal_var) # I thought this would be "U2" ... Note: you pass "Queen" not "U2", this prints "Queen" and change "Queen" to "Queen" again

print(internal_var) # I added this line; I thought this would be "U2" ... Note: internal_var is "Queen" not "U2" 

【讨论】:

    【解决方案2】:

    首先,为什么这不会导致冲突? 其次,为什么 internal_var 没有被覆盖? 三、如何覆盖internal_var?

    确实存在“冲突”,因为def printer 内部的internal_var 在全局范围内与internal_var 同名。由于您使用了global 关键字,因此通过让两个作用域都引用全局作用域中定义的值来解决冲突。通常,局部变量会“隐藏”任何具有相同名称的全局范围变量(即,为局部范围创建不同的值,并且全局范围变量变得不可访问)。

    如果“覆盖”是指重新分配它的值——它就是。这就是您在输出的列表行中看到“Queen”的原因。

    如果您的意思是“覆盖”,如上面描述的具有不同值的“遮蔽”,那是因为您使用了global 关键字,因此明确禁止局部变量遮蔽全局变量。

    我认为它在一定程度上是有用的,但它会产生更多的错误。

    是的。 使用 global 关键字是我所说的“代码味道”——这是你应该(几乎?)永远不要做的事情,因为它大大增加了神秘的虫子。如果您刚刚开始,我建议您不惜一切代价避免它,并对您看到的任何使用它的教程持怀疑态度,除非它是在只是教您如何工作的课程的上下文中(以防您必须调试别人的代码),然后再建议您不要实际使用它。 :)

    【讨论】:

    • 谢谢,现在我明白了。我以前从未使用过global,所以我很困惑。我宁愿在它们发生冲突时收到错误消息。好的,我永远不会使用global,尽管很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2019-08-21
    • 2019-07-24
    相关资源
    最近更新 更多