【问题标题】:What is the difference with this and slicing? [duplicate]这和切片有什么区别? [复制]
【发布时间】:2021-10-23 05:36:45
【问题描述】:

https://leetcode.com/problems/reverse-string/ 嘿,我正在 leetcode 上反转字符串,这就是解决方案。

def reverseString(self, s):
    """
    :type s: List[str]
    :rtype: None Do not return anything, modify s in-place instead.
    """
    s[:] = s[::-1]

我不理解的部分是 s[:]。为什么我们需要那个?根据我的想法,我们可以简单地做:

s = s[::-1]

不明白这一点,希望有人可以指导我。谢谢!

【问题讨论】:

  • 请注意已发布代码中的 cmets “.. modify s in-place instead”。正常分配会发生什么不同的事情?另请注意,s 是一个 字符串列表(并且该列表可以修改),它不会修改单个 string“反转字符串”(其中不允许,因为字符串是不可变的)。
  • This answer 准确地解决了这个示例,并附有有用的信息图形。

标签: python


【解决方案1】:

s = s[::-1] 创建一个新变量 s 并将其分配给旧变量 s 反转,保持旧 s 不变。 s[:] = s[::-1] 保留相同的旧 s 变量,只是用它的反转值改变它的内容。基本上,

def f1(s):
    s = s[::-1]

def f2(s):
    s[:] = s[::-1]


s = ["a", "b", "c"]

f1(s)
print(s)    # Outputs ["a", "b", "c"]

f2(s)
print(s)    # Outputs ["c", "b", "a"]

【讨论】:

  • 非常感谢恩佐!这很有意义!
  • 在这两种情况下,它都是“相同的变量”。虽然官方 Python 用语可能声称“创建一个新绑定”,现有局部变量的效果是“为具有给定名称的变量分配一个 [不同] 对象” (ashtonkemerling.com/posts/binding-vs-assignment )。 Python 的按对象共享调用的性质次要解释了为什么这个赋值不会影响调用者中的任何绑定(re: 变量),即使 [由参数引入] 相同的变量是重新分配。
猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 2015-08-27
  • 2014-08-07
  • 2015-05-12
  • 1970-01-01
  • 2012-07-19
  • 2013-02-19
  • 2015-11-23
相关资源
最近更新 更多