【问题标题】:How do I manipulate a list with a function in Python (global scope)?如何在 Python(全局范围)中使用函数操作列表?
【发布时间】:2020-03-02 15:29:02
【问题描述】:

我有一个包含整数和字符串l = [1, 2, 'a', 'b'] 的列表,我想编写一个函数来获取列表并以之后只包含整数的方式对其进行操作。 函数输出看起来像我想要的,但它不会改变“原始”列表。

def filter_list(l):
  temp =[]
  for item in l:
      if type(item) == int:
          temp.append(item)
  l = temp
  return l
Function output: [1, 2]
Variable explorer: [1,2,'a','b']

相比之下,函数

def manipulate(l):
    l.append("a")
    return l
Function output: [1, 2, 'a', 'b', 'a']
Variable explorer: [1, 2, 'a', 'b', 'a']

更改“原始”列表。

  1. 这两个函数有什么区别,即为什么
    第二个操纵我的“原始”列表,但第一个没有?
  2. 如何调整功能 1 以获得所需的输出?

谢谢!

【问题讨论】:

  • 为什么不将l 设置为globalglobal l
  • 想想l 在第一个函数中是什么。它是参数,而不是全局参数,重新分配参数在函数之外没有任何影响。
  • manipulate() 中,您正在改变传递给它的对象。 append 改变列表。因此,l 已更改。不要更改第一个函数,只需执行 l=filter_list(l) 并将这些 l = temp return l 替换为 return temp
  • 谢谢!我在我的函数中尝试了l = filter_list(l) 和标记las global,它可以工作。

标签: python list global-scope


【解决方案1】:

在 python 中,所有对象都通过引用传递给函数,这意味着您可以更改传递给函数的对象。这就是为什么当您在第二个示例中调用 append 方法时,列表会发生变化。

但是,如果您将不同的对象分配给传递的参数 (l = temp),那么您会更改引用本身,因此无法从外部范围更改原始对象。不过,在您的情况下这不是问题,因为您返回了新的引用,在这种情况下您应该这样做。

【讨论】:

  • 所以我认为用l = templ 的当前值替换为temp 是错误的吗?更多的是l对原始对象的引用被ltemp的引用替换,一旦函数退出,这个引用就被删除了?
  • 几乎 - l 不会成为从 ltemp 的引用,它成为对 temp 所引用内容的另一个引用。但是,是的,我想你基本上明白了。
  • 谢谢!就我认为变量的工作方式而言,参考事物发生了很大变化。不过肯定需要更深入地研究这个话题。
  • 是的,理解它绝对有用。请注意,这在语言之间是不同的。查看 C 指针以更深入地了解这一点。
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 2012-06-08
  • 2013-05-31
  • 2013-06-21
  • 2014-11-23
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多