【问题标题】:Slicing object as argument didn't change after running a function in python在 python 中运行函数后,切片对象作为参数没有改变
【发布时间】:2019-07-18 03:23:46
【问题描述】:

将可变对象传递给函数,我们可以修改其值而无需返回。但是如果我传递一个可变对象的切片,似乎在运行函数之后,该对象的值并没有改变。 这是我的代码:

def reverse(self, x):
    """
    :type x: int
    :rtype: int
    """
    s = list(str(x))
    if s[0] == "-":
        #if s=['-','1','2','3'], then s[1:]=['1','2','3'], after running self.reverseCore, s still is ['-','1','2','3']
        print(id(s[1:]))
        self.reverseCore(s[1:])
        print(s)
    else:
        #if s=['1','2','3'], after running self.reverseCore, s will be['3','2','1']
        self.reverseCore(s)
        print(s)
def reverseCore(self, s):
    print(id(s))
    if len(s)<= 1:
        return
    l = len(s)
    k = l//2
    for i in range(0, k):
        s[i], s[l-i-1] = s[l-i-1], s[i]

s[1:] 也是一个可变对象,那为什么没有变化呢?

【问题讨论】:

    标签: python python-3.x python-2.7


    【解决方案1】:

    你怎么知道s[1:] 没有改变?函数返回后,您永远不会访问它。您打印的是原始的s,而不是您传递给函数的切片。

    切片创建一个新列表,修改新列表对原列表没有影响。

    您可能会感兴趣: Reference to Part of List - Python

    【讨论】:

    • 感谢您的回答。还有一件事让我很困惑:如果切片创建了一个新对象,那么 s[1:]=something 不应该修改 s,因为 s[1:] 是一个新对象,它与 s 无关,但是这种情况不正确,s 将被更改。
    • 对于切片是完整列表的情况可能是一种优化。请阅读文档中的切片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2018-08-31
    • 2021-02-06
    • 1970-01-01
    • 2015-01-17
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多