【问题标题】:Reusing variables inside functions在函数内部重用变量
【发布时间】:2021-09-12 21:35:06
【问题描述】:

这里是初学者,下面的第一个代码没有给出任何错误并给出了预期的输出。但是在第二种情况下,我在函数的输入中使用 y 并在下面将其重新用作变量(这甚至是一个变量吗?)代替 var0。 这不应该给出语法错误吗?为什么会没事?

def x(y):

    var0 = y + [2]

    print(var0)

c = [1,2,3]

x(c)

def x(y):

    y = y + [2]

    print(y)

c = [1,2,3]

x(c)

【问题讨论】:

  • 为什么不能原地更新变量,这对我来说似乎很正常。
  • 这样使用y会出现什么语法错误?
  • 大多数植根于imperative programming的语言都可以使用函数参数作为局部变量,其中包括Python。
  • 术语 variable 意味着它的值可以改变 - 而 constant 则表示一个不变的值(Python 不会有常数)。你正在做的是改变y的价值,这很好。
  • @Woodford 谢谢我把 y 当作一个不能被覆盖的常数,我现在明白了

标签: python python-3.x variables syntax


【解决方案1】:

之所以起作用,是因为 y 参数在函数的本地范围内。这意味着它可以从该函数内的任何位置设置检索

在函数中,参数值(参数)在函数运行时存储在函数本身的符号表中(可以将其想象成一个填充了变量名称和变量值的电子表格)。

函数的第一个版本会有这个符号表:

Name       |      Value
-----------------------
y          [1,2,3]
var0       [1, 2, 3, 2]

函数的第二个版本会有这个符号表:

--Before re-assignment-
Name       |      Value
-----------------------
y          [1,2,3]

当您覆盖 y 的值时,实际上是在更改符号表中的现有值:

--After re-assignment--
Name       |      Value
-----------------------
y          [1, 2, 3, 2]

TLDR; 在这种情况下,函数参数可以像任何其他变量一样对待。

【讨论】:

  • 哦,这真的很酷,我认为 y 是一个常数,即使我自己也称它为变量,哈哈。谢谢
  • 另一个很酷的特性是,如果 y 是一个存在于不同范围内的对象,并且您在函数的范围内对其进行了更改,则该值也会在外部范围内受到影响,就像在 C 中使用指针一样,这被认为是:引用调用
  • 我得到了一半。但是,如果“外部作用域”位于函数作用域的上方,您所说的就不是这样了?因为函数会在外部作用域执行后执行,从而覆盖 y 的值?
  • 这是一个函数副作用的实际示例。不适用于原语,因为它们是按值调用,而不是按引用。 replit.com/@JordanRenaud/LightgreySturdyActivecell#main.py
  • 我明白了,我还需要注意其他类似的细微差别吗?或者更确切地说,我在哪里可以在网络上搜索这些东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2023-01-11
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多