相关文章推荐
有腹肌的充值卡  ·  pycharm console 清屏 ...·  2 月前    · 
爽快的大熊猫  ·  【Python】PyCharm ...·  17 小时前    · 
另类的牙膏  ·  WPF ComboBox ...·  1 年前    · 
酷酷的橙子  ·  WPF XAML ...·  1 年前    · 

python - 使用函数修改数组中的一个项

0 人关注

我是Python的新手。谁能给我解释一下这在python中是如何工作的? 如何在主函数中改变项目的值?

def calc(arr = []):
    index = 0
    for item in arr:
        item = item + 1
        arr[index] = item
        index += 1
if __name__ == '__main__':
    item = 1
    calc([item])
    print("item is => ", item)
    
4 个评论
你不能以这种方式改变 item 的值。把一个变量放到一个列表中,是把变量的值放进去,并不是把变量本身的引用放进去。
Python没有变量引用或别名。
与你的问题不相关,但请查看 "最小的惊奇 "和可改变的默认论点 关于使用可变的默认参数
arr 在函数中被修改,但由于item是一个简单的不可变的整数,它不能在函数中被修改,除非你把 item 声明为全局,而这并不是你真正想要的东西。(事实上,如果你从 if __name__ 部分调用一个函数 main() 或其他什么东西,而不是把代码放在那里,你的代码就会得到改进,以避免所有在那里被声明的变量有效地成为全局变量。)
python
Aks
Aks
发布于 2022-01-20
2 个回答
Grismar
Grismar
发布于 2022-01-20
已采纳
0 人赞同

如果你的目的是以某种方式改变一个不可变的值,这将是最好的。

def add_one(value):
    return value + 1
def main():
    # your code moved to a function, to avoid these variables inadvertently becoming globals
    item = 1
    # update item with the function result
    item = add_one(item)
    print("item is => ", item)
if __name__ == '__main__':
    main()

从你的例子来看,你似乎想更新一个列表,列表中的每个项目都递增1,你可以用同样的方法来做。

def add_one_all(values):
    return [values + 1 for values in values]
def main():
    items = [1, 4, 9]
    # update items with the function result
    items = add_one_all(items)
    print("items are => ", items)
if __name__ == '__main__':
    main()

然而,由于列表是可变的,你可以可以从一个函数中更新它,通过对列表进行原地修改。

def add_one_all_inplace(values: list = None):
    if values is not None:
        for i in range(len(values)):
             values[i] += 1
def main():
    items = [1, 4, 9]
    # update the content of items
    add_one_all_inplace(items)
    print("items are => ", items)
if __name__ == '__main__':
    main()

后一种解决方案的优点是不创建新的列表,如果你需要非常节省空间,或者只对一个非常大的列表做一些修改,这可能是比较好的选择--不过你的例子可能更适合第二种解决方案。

请注意,在后一种情况下,你调用该函数的方式仍然无法工作。

def main():
    item = 1
    add_one_all_inplace([item])

包含item的列表将被改变为[2],但这并不影响item本身。传给add_one_all_inplace的列表将只包含item的值,而不是对它的引用。

Aks
非常感谢你的回答。我现在明白了......所以当我们传递列表时,它变成了可变的,但列表中的变量是不可变的......所以返回值会改变它。谢谢你。我都快被这个问题搞疯了。
@aks - 大概就是这样,只要记住是类型使它可变,而不是它被传递给一个函数的事实。如果你把一个列表中的一个列表传递给一个函数,你可以同时修改这两个列表,并且会影响到函数外的变量,因为它是同一个列表--但是如果这些列表中的其他东西是不可变的(比如str、int、float、tuple等),这些东西在函数外不会被修改,它们不能被修改,就是这样。函数其实并不重要,这只是它出现最多的地方,因为涉及到一个新的局部变量(参数)。
SHYAM SHEEL
SHYAM SHEEL
发布于 2022-01-20
0 人赞同

你可以使用python中的global关键字,它允许我们将非全局变量作为全局变量使用,如果我们遇到类似 "UnboundLocalError: local variable '' referenced before assignment "这样的错误,我们也可以使用global关键字。