增值混乱

时间:2014-04-08 03:54:29

标签: python

嘿,我是python开发的新手,因为我是新手,所以我充满了许多怀疑。假装

s = 'something'
for something in s:
   something = something + 1
   print  something

我知道这里有什么作为索引,它会在s中打印出整个元素。

并在

s = 'something'
for something in s:
    s[something] = s[something] + 1
    print  something

我不明白代码第二部分的正确含义..是否可能在python中? “

对不起低等级的问题,任何帮助将不胜感激..

3 个答案:

答案 0 :(得分:3)

当你循环遍历这样的字符串时:

for c in 'something':
    print(c)

c不作为索引,它充当字符串的字符,因此输出将为:

s
o
m
e
t
h
i
n
g

如果你想循环索引,你可以这样做:

s = 'something'
for i in range(len(s)):
    print(i)

输出结果为:

0
1
2
3
4
5
6
7
8

您可以通过索引来访问字符串中的字符:

s = 'something'
for i in range(len(s)):
    print(s[i])

输出结果如下:

s
o
m
e
t
h
i
n
g

如果你想循环一个字符串以便获得字符和索引,你可以使用enumerate()函数:

s = 'something'
for i, c in enumerate(s):
    print(i, c)

输出:

0 s
1 o
2 m
3 e
4 t
5 h
6 i
7 n
8 g

请注意,字符串是不可变的,因此您无法更改它们:

>>> s = 'something'
>>> s[0] = 'a'
TypeError: 'str' object does not support item assignment

当您进行字符串连接时,实际上并没有更改字符串,而是创建一个新字符串。


编辑1

字符串具有可以调用它们来执行某些任务的方法,例如.split()方法:

>>> s = 'something'
>>> s.split('e')
['som', 'thing']

他们也有一些特殊的方法,如__getitem__。以下两个是等效的:

>>> s = 'something'
>>> s[0]
's'
>>> s.__getitem__(0)
's'

列表等其他序列是可变的,因此它们也有__setitem__方法:

>>> s = ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
>>> s[0] = 't'
>>> s
['t', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
>>> s.__setitem__(0, 's')
>>> s
['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

编辑2

当您尝试执行此操作时会发生这种情况s[something] = s[something] + 1

>>> s = 'something'
>>> s[0] = s[0] + 1
TypeError: Can't convert 'int' object to str implicitly

发生这种情况的原因是因为s[0]'s'所以你试图在字符串中添加一个数字,这没有任何意义。然后,如果您尝试执行s[something] = s[something] + 'a',您将获得TypeError,因为字符串是不可变的:

>>> s = 'something'
>>> s[0] = s[0] + 'a'
TypeError: 'str' object does not support item assignment

这肯定不起作用:

>>> s = 'something'
>>> s['a']
TypeError: string indices must be integers

答案 1 :(得分:0)

变量名后面的方括号根据上下文调用变量__getitem____setitem__。例如,x[i] = x[i] + 1相当于x.__setitem__(i, x.__getitem__(i) + 1)。您可以在此处的文档中阅读相关内容:
https://docs.python.org/2/reference/datamodel.html

有几种内置类型可以实现其中的一个或两个,例如字符串,元组,列表和字典。对于序列类型(字符串,元组,列表),正在访问或设置的“项目”是一个索引,因此例如print 'hello'[0]将打印h,因为您在第一个索引处获取该字符列表。

在这种情况下,看起来第二段代码实际上会导致错误,因为字符串不可变。这意味着无法修改字符串对象,因此它们不会被__setitem__实现,s[something] = s[something] + 1将失败。这可以使用像list或dict这样的可变类型,例如:

s = [1, 1, 1]
s[0] = s[0] + 1
# s is now [2, 1, 1]

答案 2 :(得分:0)

s[something] = s[something] + 1不应该工作;字符串值是不可变的。

s += "foo"之类的语法实际上会从s + "foo"创建一个新的字符串值,然后将其分配给s,释放原始值s以进行垃圾回收。

要记住Python中所有变量的一个关键要素是它们只是对值的引用。不能保证这些值不会在某处汇集,并且具有写时复制语义。另一个例子是类似x = 5之类的内容并不会x设置为5,它会创建(或以其他方式获取)值5并设置x引用它。

在大多数情况下,这种区别并不重要。一般来说,Right Thing(TM)会发生。


代码:

s = 'something'
for something in s:
    # ... 

s视为一个字符列表,并通过循环将something按顺序设置到每个字符。 (这与JavaScript不同。)如果您想要索引而不仅仅是字符,请使用:

s = 'something'
for i, something in enumerate(s):
    # ... 

  

所以s [something] = s [something] + 1在任何情况下都不可能..正确吗?

它适用于列表(例如[1, 2, 3])和字典(例如{"a": 1, "b": 2})。只是不是为了字符串。

如果你只想获得一个字符串,其中每个字符都被下一个字符替换,首先用字符串理解来分割字符串:

l = [c for c in s]

用下一个字符替换每个字符:

l2 = [chr(ord(c) + 1) for c in l]

将它们粘合在一起形成一个新的字符串:

s2 = ''.join(l2)

全部放在一起:

s = 'something'
s2 = ''.join([chr(ord(c) + 1) for c in s])