【问题标题】:Variable used, golobal or local?使用的变量,全局的还是局部的?
【发布时间】:2019-11-25 14:22:57
【问题描述】:

我收到一条消息“分配前引用了局部变量”

使用外部变量并成功,但赋值失败

x = 10
y = 10

def some():

    print(x)

some()

10
x = 10
y = 10
def some():
    x = 100-x+x
    print(x)
some()

local variable 'x' referenced before assignment
x = 10
y = 10
def some():
    t=100-x
    print(t)
some()

90
x = 10
y = 10
def some():
    t=100-x
    x=t
    print(t)
some()

local variable 'x' referenced before assignment

有什么区别?预期结果应该相同,但在第二个样本中失败。

这是否意味着我只能从 'x' 读取,不能写入 'x' ?

【问题讨论】:

  • 不是关于如何使用全局声明,只是为了确认为什么使用与函数外部同名的变量,并通过解释器获取不同的变量声明。
  • 我认为变量应该定义为局部变量,或者全局变量不取决于它在子程序中的使用方式。

标签: python global local


【解决方案1】:

当您在函数内声明变量时,它会从外部作用域中隐藏具有相同名称的变量。一旦你在函数内部声明了x,它将成为函数中所有命令的x变量,甚至在x = 10的外部作用域分配之前。

如果你想写入外部作用域中的x变量,你应该将它声明为global x,即

x = 10
y = 10
def some():
    global x
    x = 100-x+x
    print(x)
some()

100

【讨论】:

  • 我知道它可以解决我的问题,但是如果这里有数千个项目,那又如何呢?我想知道为什么会这样,而不是仅仅为了得到结果。
  • 不同之处在于,一旦您在函数内部定义了变量x,它就会成为函数唯一知道的x,或者,函数的变量阴影全局变量,即整个函数都是如此,而不仅仅是赋值后的行,这就是为什么第二个示例的行为与第一个不同的原因
  • if,if,没有全局声明,我们如何在子程序中使用相同的变量名进行一些迭代,最后,变量保留结果。可能有很多变量,数千个项目?全局声明对它不利。
  • 使用这样的全局变量通常被认为是一种不好的做法,隐藏变量也被认为是不好的,因为它会降低可读性,所以最好的解决方案是避免两者,如果你必须分配给全局变量你别无选择,只能将它声明为全局,如果你只想使用它的值,那么最好的做法是不要隐藏他的名字
  • "一旦"你在你的函数中定义了变量 x ...。这是否意味着我不能定义变量,只是使用它? x= x+1 会将变量“x”的定义从全局更改为局部?如果没有全局声明且没有返回值,是否意味着在函数/方法完成后我无法获取新值。
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多