当前位置: 首页 > 面试题库 >

Python-定义变量后如何更改?

鲜于凯歌
2023-03-14
问题内容

我正在尝试从已定义的变量中增加或减少,但是我不知道如何用新的变量覆盖旧的值。

a = 15

def test():
    a = a +10
    print ( a )

test()

错误信息:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 4, in test
    a = a +10
UnboundLocalError: local variable 'a' referenced before assignment

问题答案:

尝试运行代码时遇到的错误是:

UnboundLocalError: local variable 'a' referenced before assignment

…从表面上看,这似乎很奇怪:毕竟,()代码中的第一个语句a = 15是一个赋值。发生什么了?

实际上,发生了两种截然不同的事情,除非你已经知道它们,否则它们都不是显而易见的。

首先,你实际上有两个不同的变量:

  • 在a你的第一行是一个全局变量(所谓的,因为它存在于全球范围内,外的任何函数定义)。

  • 将a在其他行是一个局部变量,也就是说,它只是你的内部存在test()功能。

尽管这两个变量具有相同的名称,但它们彼此之间完全不相关。

如果在函数内部有分配给该函数的语句(例如,你的a = a +10行),则该变量是函数的局部变量。

即使这样,错误仍然看起来很奇怪-毕竟,你在内部所做的第一件事test()就是分配给a,那么如何预先引用它呢?

答案是,在赋值语句中,Python先评估=符号右手边的所有内容,然后再将其赋给左手边的名称-因此,即使赋值是首先写在代码中的,也要先a被引用右侧:a +10

有两种解决方法。首先是要告诉Python你真的希望a内部在全局范围内test()是相同a的:

def test():
    global a
    a = a + 10
    print(a)

这将起作用,但这是编写程序的一种非常糟糕的方法。更改函数内部的全局变量很难真正快速地进行管理,因为你通常有很多函数,而且它们中的任何一个都无法确保另一个函数不会以他们不期望的某种方式弄乱全局变量。

更好的方法是将变量作为参数传递给函数,如下所示:

a = 15

def test(x):
    x = x + 10
    print(x)

test(a)

请注意,名称不必相同-你的新定义test()只是说它接受一个值,然后对其进行处理。你可以输入任何喜欢的内容-可以是a,或数字7或其他名称。实际上,如果你尝试避免在不同作用域中使用具有相同名称的变量,那么你的代码将始终易于理解。

如果你使用上面的代码,你会发现一些有趣的事情:

>>> a = 15
>>> test(a)
25
>>> a
15

…… a没有改变!这是因为,尽管你将其传递test()x它,并被分配给,但后来还是x被更改了,而原来的文件却没有a。

如果要实际更改a,则需要x从函数返回html" target="_blank">修改后的值,然后将其重新分配回a外部:

>>> a = 15
>>> 
>>> def test(x):
...     x = x + 10
...     print(x)
...     return x
... 
>>> a = test(a)
25
>>> a
25


 类似资料:
  • 问题内容: 我知道标准示例:如果直接执行模块,则其全局变量定义为。但是,在文档的任何地方都找不到关于一般情况下如何定义的精确描述。该模块的文件说… 在模块内,模块名称(作为字符串)可用作全局变量的值。 …但是“模块名称”是什么意思?它仅仅是模块的名称(已删除的文件名),还是包括标准的软件包名称? 如何确定Python模块中变量的值?为了获得加分,请准确指出此操作在Python源代码中的何处执行。

  • 问题内容: 在我的 Dockerfile中 ,我想 定义 稍后 可以 在Dockerfile中使用的变量 。 我知道该指令,但是我不希望这些变量是环境变量。 有没有一种方法可以 在Dockerfile范围内声明变量 ? 问题答案: 您可以使用-请参阅https://docs.docker.com/engine/reference/builder/#arg 该指令定义了一个变量,用户可以在构建时使用

  • 有没有一种方法可以在Dockerfile范围声明变量?

  • 我想在调用这个函数的时候 初始化一次这个参数全局变量 后续辉修改这个参数的值 我这样写 报错了 请问如何修改呢?

  • 问题内容: 在jQuery的核心风格指南建议两种不同的方法来检查一个变量是否被定义。 全局变量: 局部变量: 特性: 为什么jQuery为什么对全局变量使用一种方法而对局部变量和属性使用另一种方法? 问题答案: 对于未声明的变量,将返回字符串文字,而身份检查将触发错误 “未定义foo” 。 对于局部变量(您 知道 已在某处声明),不会发生此类错误,因此进行身份检查。

  • 主要内容:Python 变量的赋值,Python 变量的使用,Python 是弱类型的语言任何编程语言都需要处理数据,比如数字、字符串、字符等,我们可以直接使用数据,也可以将数据保存到变量中,方便以后使用。 变量(Variable)可以看成一个小箱子,专门用来“盛装”程序中的数据。每个变量都拥有独一无二的名字,通过变量的名字就能找到变量中的数据。 从底层看,程序中的数据最终都要放到内存(内存条)中,变量其实就是这块内存的名字。 和变量相对应的是 常量(Constant),它们都是用来“