Python 价值增值混淆

Python 价值增值混淆,python,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开发的新手,由于我是个新手,所以我充满了很多疑问

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中可能吗??。。 "


很抱歉提出了低级问题,如果您有任何帮助,我们将不胜感激。

变量名后的方括号将根据上下文调用变量的
\uuuuu getitem\uuuuuuuu
\uuuu setitem\uuuuuuuuu
。因此,例如,
x[i]=x[i]+1
相当于
x.\uuuu设置项\uuuuuuuuuu(i,x.\uuuu获取项\uuuuuuuuuuuui)+1)
。您可以在此处的文档中了解这一点:

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


在本例中,看起来第二段代码实际上会导致错误,因为字符串是不可变的。这意味着不能修改字符串对象,因此它们不会实现
\uuuu setitem\uuuuuu
,并且
s[something]=s[something]+1
将失败。这可能适用于可变类型,例如list或dict,例如:

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

当您循环遍历如下字符串时:

for c in 'something':
    print(c)
s = 'something'
for i in range(len(s)):
    print(s[i])
c
不作为索引,它作为字符串的字符,因此输出为:

s
o
m
e
t
h
i
n
g
0
1
2
3
4
5
6
7
8
s
o
m
e
t
h
i
n
g
如果要循环索引,可以执行以下操作:

s = 'something'
for i in range(len(s)):
    print(i)
其结果是:

s
o
m
e
t
h
i
n
g
0
1
2
3
4
5
6
7
8
s
o
m
e
t
h
i
n
g
您可以通过如下索引方式从字符串中访问字符:

for c in 'something':
    print(c)
s = 'something'
for i in range(len(s)):
    print(s[i])
其结果是:

s
o
m
e
t
h
i
n
g
0
1
2
3
4
5
6
7
8
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']
>>> 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']
它们还有一些特殊的方法,如
\uuu getitem\uuu
。以下两项是等效的:

>>> s = 'something'
>>> s[0]
's'
>>> s.__getitem__(0)
's'
其他序列(如列表)是可变的,因此它们也有一个
\uuu setitem\uuu
方法:

>>> s = 'something'
>>> s.split('e')
['som', 'thing']
>>> 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

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

s+=“foo”
这样的语法实际上是从
s+“foo”
创建一个新的字符串值,然后将其分配给
s
,释放
s
的原始值以进行垃圾收集

Python中所有变量需要记住的一点是,它们只是对值的引用。无法保证这些值不会汇集到某个地方,并且具有写时拷贝语义。另一个例子是,like
x=5
不会将
x
设置为
5
,而是创建(或以其他方式获得)值
5
,并将
x
设置为引用该值

在大多数情况下,这种区别其实并不重要。一般来说,正确的事情(TM)会发生


守则:

s = 'something'
for something in s:
    # ... 
s
视为一个字符列表,并通过循环按顺序将
某物设置为每个字符。(这与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])

请你再解释一下好吗?。我没听懂你的意思。我想在x[i]=x[i]+1中,[u getitem]没有角色。你一定是在开玩笑。OP是个新手。
\uuu getitem\uuuuuuuuuu
\uuuuu setitem\uuuuuuuuuu
只有在类中被重写时才重要。字符串没有
\uuuuuuuuuuuuuuuuuuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuu
对不起,本打算添加更多信息,但我的联盟游戏开始了:)所以s[something]=s[something]=s[something]+1在任何情况下都不+1不可能?所以s[something]=s[something]+1在任何情况下都是不可能的。对吗?答案见上文。