【问题标题】:write a function that cuts from a list argument passed by reference编写一个从通过引用传递的列表参数中剪切的函数
【发布时间】:2016-01-21 11:24:27
【问题描述】:

我需要编写一个函数,从作为参数传递的列表中删除前两项并更改它。 不返回修改后的列表

所以如果来电:

fruits = ['apple','orange','grape','banana']
print fruits # prints ['apple','orange','grape','banana']
f1(fruits)
print fruits # prints ['grape','banana']

我试过了:

def f1(a):
    a[:] = a[2:] # throws TypeError: 'str' object does not support item assignment
def f1(a):
    a = a[2:] # doesn't change the value of fruits

f1(*a) 似乎都不起作用。我搜索了 StackOverflow,但似乎找不到答案。

请不要告诉我从f1返回a的值。

【问题讨论】:

  • 第一个函数,a[:] = a[2:],对我来说很好用。
  • 可变对象在 Python 中总是通过引用传递。如果将列表作为参数传递给您的第一个 f1() 函数,则它不会引发 TypeError(这是执行您想要的操作的正确方法)。看起来你必须在测试时传递了一个字符串。
  • 你是对的 martineau,但昨天我用正常的字符串列表尝试了它,但它不起作用。奇怪的是现在它可以工作了

标签: python pass-by-reference


【解决方案1】:

切片操作符 ([x:y]) 创建另一个列表,您需要做的是删除列表中已经存在的元素,如下所示:

def f1(a):
     del a[0:2]

【讨论】:

  • a[x:y] 可能会创建一个新列表,但将其分配给a[:] 会将a 的内容替换为新列表。
【解决方案2】:

试试下面的功能!你必须改变 a 本身,而不是创建另一个列表。

def f(a):
    del a[0]
    del a[0]

【讨论】:

    【解决方案3】:

    您可以使用列表的pop 方法来就地更改输入列表:

    def f(a):
       a.pop(0)
       a.pop(0)
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多