不是说元组不能被修改吗?
import pygameimport sys
from pygame.locals import *
pygame.init()
size = width, height = 640, 480
bg = (0, 0, 0)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')
turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2
print(turtle.get_at(position.center))
print(type(turtle.get_at(position.center)))
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
#screen.fill(bg)
screen.blit(background, (0, 0))
screen.blit(turtle, position)
pygame.display.flip()
clock.tick(30)
运行后返回:
(94, 93, 36, 255)
<class 'pygame.Color'>
可见这是一个类,而小甲鱼在教学视频里说这是一个4元组,后面还用for循环语句+set_at()方法对其进行了修改
------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------
【我的问题】
1、不是说元组不可修改的吗?
******************************
感谢大神不吝赐教,为新手解疑释惑。
赠人玫瑰,手有余香,好人一生平安!
元组一定不可修改,你到底想问什么,小甲鱼在视频里的一句话?莫名其妙! jackz007 发表于 2022-6-24 21:57
元组一定不可修改,你到底想问什么,小甲鱼在视频里的一句话?莫名其妙!
1、小甲鱼视频里说这是一个四元组(实际类型显示是一个类),
2、既然大家都知道元组是不可修改,但小甲鱼后面又举了一个例子用修改元组的方式来设置透明?小甲鱼举例见下:
import pygame
import sys
from pygame.locals import *
pygame.init()
size = width, height = 640, 480
bg = (0, 0, 0)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')
turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2
for i in range(position.width):
for j in range(position.height):
temp = turtle.get_at((i, j))
print(type(temp)) # 返回的类型是<class 'pygame.Color'>,不是元组???
if temp != 0:
temp = 200
turtle.set_at((i, j), temp)
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
#screen.fill(bg)
screen.blit(background, (0, 0))
screen.blit(turtle, position)
pygame.display.flip()
clock.tick(30) lzb1001 发表于 2022-6-24 22:03
1、小甲鱼视频里说这是一个四元组(实际类型显示是一个类),
2、既然大家都知道元组是不可修改,但小 ...
是不是理解错误???
get_at((i, j))
参数 "(i, j)" 是个元组,是你传入的元组。 本帖最后由 lzb1001 于 2022-6-24 22:40 编辑
ba21 发表于 2022-6-24 22:13
是不是理解错误???
get_at((i, j))
参数 "(i, j)" 是个元组,是你传入的元组。
……
temp = turtle.get_at((i, j))# get_at()方法获得的是单个像素的颜色(即RGBA值),然后将RGBA值赋值给变量temp,而RGBA值=(R, G, B, A),这是不是就是小甲鱼说的四元组?temp不是指的是其中A的值吗?
print(type(temp)) # 将返回<class 'pygame.Color'>,不是元组???
if temp != 0:
temp = 200
……
试着打印temp的值:
import pygame
import sys
from pygame.locals import *
pygame.init()
size = width, height = 640, 480
bg = (0, 0, 0)
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')
turtle = pygame.image.load(r'd:\\work\turtle.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2
for i in range(position.width):
for j in range(position.height):
temp = turtle.get_at((i, j))
print(type(temp)) # 返回的类型是<class 'pygame.Color'>,不是元组???
if temp != 0:
print(temp) # 打印修改前的RGBA值
temp = 200
print(temp) # 打印修改后的RGBA值
turtle.set_at((i, j), temp)
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
#screen.fill(bg)
screen.blit(background, (0, 0))
screen.blit(turtle, position)
pygame.display.flip()
clock.tick(30)
返回结果(截选部分)如下:
从图中也可以看出temp就是RGBA的值。
******************
请大神多多指教。 本帖最后由 临时号 于 2022-6-24 22:44 编辑
lzb1001 发表于 2022-6-24 22:21
……
temp = turtle.get_at((i, j))# get_at()方法获得的是单个像素的颜色(即RGBA值),然后将RGBA ...
在pygame的官方文档中有这样一句话
Color objects support equality comparison with other color objects and 3 or 4 element tuples of integers
翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
这也正是小甲鱼称它为4元组的原因,最多4个元素的元组 本帖最后由 lzb1001 于 2022-6-24 22:52 编辑
临时号 发表于 2022-6-24 22:39
在pygame的官方文档中有这样一句话
翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的 ...
谢谢大神指点,不过这只是说明了为什么小甲鱼称它为4元组的原因。
*******************************************
Color objects support equality comparison with other color objects and 3 or 4 element tuples of integers
翻译过来就是Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
1、没看懂这句话的意思。我英文自认还算不错,但看编程语言的官网原文档有时还是很晕,即使用翻译软件有时也不一定能理解中文的翻译,因为翻译软件是直翻,翻译的不一定看得懂
2、既然RGB是3元组,RGBA是4元组,元组不可修改,那为何可以通过temp=200的方式来修改A的值呢? lzb1001 发表于 2022-6-24 22:50
谢谢大神指点,不过这只是说明了为什么小甲鱼称它为4元组的原因。
******************************* ...
虽然他被称为元组,可它本质上并不是元组
pygame.Color甚至都不是turpe的子类
你用is运算符就知道pygame.Color本质上不是元组
>>> a = pygame.Color(12,12,12,12)
>>> b = (12,12,12,12)
>>> a is b
False
而你用==运算符却返回是True,这也是他被称为4元组的其中一个原因
>>> a == b
True
所以,pygame.Color本质上不是元组 我们再来念一下这句话
Color对象支持与其他颜色对象和3或4元素整数元组的相等比较
意思很简单元组可以用==运算符和它进行比较,也就是我上一个例子说的
>>> a == b
True 本帖最后由 lzb1001 于 2022-6-24 23:04 编辑
临时号 发表于 2022-6-24 22:58
虽然他被称为元组,可它本质上并不是元组
pygame.Color甚至都不是turpe的子类
你用is运算符就知道pygame ...
确实,用代码print(type(temp)) 返回的类型是<class 'pygame.Color'>,而不是tuple元组
但它返回的结果(12,12,12,12)让人看得觉得很像元组 lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组
对啊,temp是pygame.Color类实例化出来的一个对象 本帖最后由 hrpzcf 于 2022-6-24 23:05 编辑
只要type结果不是<class 'tuple'>,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因为这些都可以通过重写魔法方法来实现。 lzb1001 发表于 2022-6-24 23:02
确实,用代码print(type(temp)) 返回的类型是,而不是tuple元组
但它返回的结果(12,12,12,12)让人看 ...
所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组 本帖最后由 lzb1001 于 2022-6-24 23:42 编辑
hrpzcf 发表于 2022-6-24 23:04
只要type结果不是,就不是元组。你不要从打印出来的字符串形式去判断,也不要从是否能用下标取值来判断,因 ...
大神看得真准,我就是犯了这样的错误:一方面听了小甲鱼说4元组,另一方面看它返回的是个“元组”形式,再加上下标,三个加一起所以我就认为它是元组,谢谢大神的提醒 有一说一,虽然没看你说的小甲鱼那个视频,但有没有可能是你自己钻牛角尖了。一个问题,Python里有元组这个类型,但你何时听说过Python里的元组数据是几元组的叫法,至少我没听说过,而且搜索引擎简单查询了一下,也没有相关描述。换个角度,数学里这个叫法却是并不少见,包含三个元素的一组数据叫作三元组,平面坐标(x,y)又叫作二元组。所以三元组这个叫法是描述这组数据的元素个数,与Python的元组类型无关 临时号 发表于 2022-6-24 23:07
所谓4元组只不过是我们给的一个名字罢了,本质上它不是元组
这个名字很容易误会,尤其对于初学者 风车呼呼呼 发表于 2022-6-24 23:10
有一说一,虽然没看你说的小甲鱼那个视频,但有没有可能是你自己钻牛角尖了。一个问题,Python里有元组这个 ...
谢谢,我是学得、看得、听得比较仔细,加上看到弹幕中也有其他初学者有此疑问,所以提出来,倒不是什么纠结的问题。
页:
[1]