Python 价值增值混淆
嘿,我是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 我没有
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中所有变量需要记住的一点是,它们只是对值的引用。无法保证这些值不会汇集到某个地方,并且具有写时拷贝语义。另一个例子是,likex=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在任何情况下都是不可能的。对吗?答案见上文。