Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中普通变量访问的用途是什么?_Python - Fatal编程技术网

Python中普通变量访问的用途是什么?

Python中普通变量访问的用途是什么?,python,Python,在python中,这种语法被接受并正确运行 foo = "test variable" foo # plain variable access foo # plain variable access print(foo) >>>>test variable Q:所以我的问题是,Python上下文中的用例是什么?其他一些语言会强调这是一个语法错误 为了确保发生了一些事情,我使用了dis模块并获得了以下输出 def test(): foo = "test

在python中,这种语法被接受并正确运行

foo = "test variable"
foo # plain variable access
foo # plain variable access
print(foo)
>>>>test variable    
Q:所以我的问题是,Python上下文中的用例是什么?其他一些语言会强调这是一个语法错误


为了确保发生了一些事情,我使用了
dis
模块并获得了以下输出

def test():
    foo = "test variable"
    foo
    return foo

dis.dis(test)
>>>>3           0 LOAD_CONST               1 ('test variable')
                2 STORE_FAST               0 (foo)

    4           4 LOAD_FAST                0 (foo)
                6 POP_TOP

    5          12 LOAD_FAST                0 (foo)
              14 RETURN_VALUE

def test():
    foo = "test variable"
    return foo

dis.dis(test)
>>>>9           0 LOAD_CONST               1 ('test variable')
                2 STORE_FAST               0 (foo)

   10           4 LOAD_FAST                0 (foo)
                6 RETURN_VALUE
正如你所看到的,有一个额外的操作,我似乎无法理解

 4 LOAD_FAST                0 (foo)
 6 POP_TOP

除了REPL作为
打印的快捷方式(如果var不是None-other“”,则repr(var))
,它没有任何用途

LOAD\u FAST
将变量添加到堆栈中,然后
POP\u TOP
将其删除。实际上什么也没发生


为什么允许这样做?嗯,因为这比不简单。我的意思是我们必须小心地允许
func()
,但不允许
func
。当我们使用属性时,它也变得更加复杂,例如:

class T:
    def __init__(self):
         self.gets = 0
    @property
    def attr(self):
        self.gets += 1

t = T()
print(t.gets)  # 0
t.attr
print(t.gets)  # 1

因此,即使是引用“普通属性”的行为也可能有副作用。

除了将REPL用作打印的快捷方式(如果var不是其他“”,则为repr(var))

LOAD\u FAST
将变量添加到堆栈中,然后
POP\u TOP
将其删除。实际上什么也没发生


为什么允许这样做?嗯,因为这比不简单。我的意思是我们必须小心地允许
func()
,但不允许
func
。当我们使用属性时,它也变得更加复杂,例如:

class T:
    def __init__(self):
         self.gets = 0
    @property
    def attr(self):
        self.gets += 1

t = T()
print(t.gets)  # 0
t.attr
print(t.gets)  # 1

因此,即使是引用“普通属性”的行为也可能有副作用。

附加的
foo
s没有可观察的效果。dis输出显示该值已加载,然后立即丢弃


python中丢弃值不是错误。

附加的
foo
s没有可观察的效果。dis输出显示该值已加载,然后立即丢弃


python中丢弃值不是错误。

请注意,如果我删除建议的其他问题,我会理解。另外,如果在python中这些类型的调用有一个特定的名称,我将进行编辑?注意,我可以在例如C中做同样的事情(尽管编译器可能会抛出警告)。我在问,既然它被接受了,是否有一个用例。我不会称它为“变量调用”(太接近“函数调用”);也许是“可变访问”。为了避免混淆。然后我向你的问题提出建议,并将文本中的标题和主要问题更改为“Python中纯变量本身的用途是什么?”这是一个稍微不同但希望比“为什么”更清楚的问题。请注意,如果我删除建议的其他问题,我会理解。另外,如果在python中这些类型的调用有一个特定的名称,我将进行编辑?注意,我可以在例如C中做同样的事情(尽管编译器可能会抛出警告)。我在问,既然它被接受了,是否有一个用例。我不会称它为“变量调用”(太接近“函数调用”);也许是“可变访问”。为了避免混淆。然后我向你的问题提出建议,并将文本中的标题和主要问题更改为“Python中纯变量本身的用途是什么?”这是一个稍微不同但希望比“为什么”更清楚的问题。我明白了,但当从脚本运行它时,这些行不会发生任何事情,这能被推翻吗?你说的推翻是什么意思?比如强迫某事发生?或者强制发出警告(大多数IDE都会为此发出警告)?我的意思是,如果我只在上面代码的一行上使用
t
,那么什么也不会发生。是否有一种特殊的方法与此相关。当我只使用变量的名称时,我是否可以强制某些事情发生。不,你不能。那会很混乱。考虑到它在intepreter中有一个行为,我不知道它在代码中是否会那么混乱。我明白了,但是当从脚本运行它时,这些行上不会发生任何事情,可以重写吗?重写是什么意思?比如强迫某事发生?或者强制发出警告(大多数IDE都会为此发出警告)?我的意思是,如果我只在上面代码的一行上使用
t
,那么什么也不会发生。是否有一种特殊的方法与此相关。当我只使用变量的名称时,我是否可以强制某些事情发生。不,你不能。这将是非常令人困惑的。考虑到它在intepreter中有一个行为,我不知道它在代码中是否会如此令人困惑。