第三个克隆海龟

2024-04-12

我在尝试制作追逐游戏时制作了这个程序,但我偶然发现了一些非常奇怪的东西。我创建了海龟的克隆体,但在地图中间出现了第三个。

有谁知道是什么原因造成的?

import turtle

sc = turtle.Screen()
t = turtle.Turtle()
c = turtle.clone()
c.penup
t.penup
c.goto(100,100)

def turnleft():
    t.left(30)

def turnright():
    t.right(30)

while True:
    t.forward(2)
    c.forward(2)
    sc.onkey(turnleft, "Left")
    sc.onkey(turnright, "Right")
    sc.listen()

非常好的问题。我能够重现这种行为:如果你只养一只乌龟,print(len(turtle.turtles()))按预期给出 1,但克隆一次后,突然出现 3。这是一个最小的示例:

import turtle

t = turtle.Turtle()
print(len(turtle.turtles())) # => 1, no problem
c = turtle.clone()
print(len(turtle.turtles())) # => 3 !!?

问题是调用.clone() on turtle(模块)而不是您想要克隆的海龟实例:

import turtle

t = turtle.Turtle()
c = t.clone()
print(len(turtle.turtles())) # => 2 as expected

这是经典海龟陷阱 https://gist.github.com/ggorlen/f46857bd0057ca919b97d5569f6ec641:将函数式接口误认为是面向对象的接口。你打电话时turtle.clone(),这是一个函数调用,因此该模块创建其单例非 OOP 海龟,然后克隆它并返回您存储在其中的克隆c.

无与伦比的cdlane https://stackoverflow.com/users/5771269/cdlane 倡导者 https://stackoverflow.com/a/62296811/6243352对于以下导入:

from turtle import Screen, Turtle

这使得事情很难搞砸。


如果您对导致该行为发生的 CPython 海龟内部结构感到好奇,这里是代码(来自库/turtle.py#L3956 https://github.com/python/cpython/blob/81bf10e4f20a0f6d36b67085eefafdf7ebb97c33/Lib/turtle.py#L3956):

## The following mechanism makes all methods of RawTurtle and Turtle available
## as functions. So we can enhance, change, add, delete methods to these
## classes and do not need to change anything here.

__func_body = """\
def {name}{paramslist}:
    if {obj} is None:
        if not TurtleScreen._RUNNING:
            TurtleScreen._RUNNING = True
            raise Terminator
        {obj} = {init}
    try:
        return {obj}.{name}{argslist}
    except TK.TclError:
        if not TurtleScreen._RUNNING:
            TurtleScreen._RUNNING = True
            raise Terminator
        raise
"""

def _make_global_funcs(functions, cls, obj, init, docrevise):
    for methodname in functions:
        method = getattr(cls, methodname)
        pl1, pl2 = getmethparlist(method)
        if pl1 == "":
            print(">>>>>>", pl1, pl2)
            continue
        defstr = __func_body.format(obj=obj, init=init, name=methodname,
                                    paramslist=pl1, argslist=pl2)
        exec(defstr, globals())
        globals()[methodname].__doc__ = docrevise(method.__doc__)

_make_global_funcs(_tg_screen_functions, _Screen,
                   'Turtle._screen', 'Screen()', _screen_docrevise)
_make_global_funcs(_tg_turtle_functions, Turtle,
                   'Turtle._pen', 'Turtle()', _turtle_docrevise)

这需要所有的乌龟Screen() and Turtle()方法并将它们连接到模块的全局变量中,所以turtle.Turtle().clone被设定为turtle.clone。作为此次重新布线的一部分,__func_body向每个调用添加一些样板,检查是否Turtle._pen or Turtle._screen已经存在,如果不存在则创建它们。


无关,但你需要打电话pendown()如果你想让它做任何事情,请用括号括起来。另外,最好在循环之前而不是在循环内部设置事件侦听器,或者完全删除它,因为它与问题无关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第三个克隆海龟 的相关文章

  • sklearn 估计器管道的参数无效

    我正在实现 O Reilly 书中的一个示例 Python 机器学习简介 使用 Python 2 7 和 sklearn 0 16 我正在使用的代码 pipe make pipeline TfidfVectorizer LogisticRe
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • 如何(重新)命名 pandas 数据框中的空列标题而不导出到 csv

    我有一个熊猫数据框df1带有一个索引列和一系列未命名的值 我想为未命名的系列指定一个名称 到目前为止 我知道的唯一方法是导出到df1 csv using df1 to csv df1 csv header Signal 然后使用以下命令重新
  • 键入的完整命令行

    我想获得输入时的完整命令行 This join sys argv 在这里不起作用 删除双引号 另外 我不想重新加入已解析和拆分的内容 有任何想法吗 你太迟了 当键入的命令到达 Python 时 您的 shell 已经发挥了它的魔力 例如 引
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 用 Python 绘制直方图

    我有两个列表 x 和 y x 包含字母表 A Z Y 包含它们在文件中的频率 我尝试研究如何在直方图中绘制这些值 但在理解如何绘制它方面没有成功 n bins patches plt hist x 26 normed 1 facecolor
  • Django 多对多关系(类别)

    我的目标是向我的 Post 模型添加类别 我希望以后能够按不同类别 有时是多个类别 查询所有帖子 模型 py class Category models Model categories 1 red 2 blue 3 black title
  • 为什么 re.findall 在查找字符串中的三元组项时不具体。 Python

    所以我有四行代码 seq ATGGAAGTTGGATGAAAGTGGAGGTAAAGAGAAGACGTTTGA OR 0 re findall r ATG 9 TAA TAG TGA seq 首先让我解释一下我正在尝试做什么 如果这令人困惑
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 类型错误:此 COM 对象无法自动执行 makepy 过程 - 请为此对象手动运行 makepy

    这是什么错误 回溯错误 C Users DELL PycharmProjects MyNew venv Scripts python exe C Users DELL PycharmProjects MyNew agaaaaain py T
  • 更改 Matplotlib 投影轴的背景颜色

    我正在尝试使用 Cartopy 创建一个图形 该图形需要在未投影的轴上绘制投影轴 这是一个尽可能简单的代码版本 它将轴上的内容替换为背景颜色 import matplotlib pyplot as plt import cartopy cr
  • Python-验证我的文档 xls 中是否存在工作表

    我正在尝试在空闲时间设计一个小程序 加载 xls 文件 然后在要扫描的文档中选择一张纸 步骤1 用户导入 xls文件 导入程序后检查文件是否存在 我能做到的 第 2 步 我要求用户提供要分析的文档表 xls 的名称 这就是它停止的地方 该程
  • Seaborn 中没有线性拟合的散点图

    我想知道是否有办法关闭seaborn中的线性拟合lmplot或者是否有一个等效函数可以生成散点图 当然 我也可以使用 matplotlib 但是 我发现 seaborn 中的语法和美学非常吸引人 例如 我想绘制以下情节 import sea
  • Python:如何在不先创建整个列表的情况下计算列表的总和?

    通常我们必须 1 声明一个列表 2 使用以下方法计算该列表的总和sum 但现在我希望指定一个以 1 开头 间隔为 4 100 个元素的列表 如下所示 1 5 9 13 17 21 25 29 33 37 我不想涉及数学公式 所以 1 如何在
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • pandas.read_fwf 忽略提供的数据类型

    我正在从文本文件导入数据框 我想指定列的数据类型 但 pandas 似乎忽略了dtype input 一个工作示例 from io import StringIO import pandas as pd string USAF WBAN S
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to
  • Biopython 可以执行 Seq.find() 来解释歧义代码吗

    我希望能够在 Seq 对象中搜索考虑歧义代码的子序列 Seq 对象 例如 以下内容应该是正确的 from Bio Seq import Seq from Bio Alphabet IUPAC import IUPACAmbiguousDNA

随机推荐

  • 如何使用 TensorFlow 加载稀疏数据?

    有一个关于加载稀疏数据的小片段 但我不知道如何使用它 SparseTensors 不能很好地处理队列 如果您使用 SparseTensors 则必须在批处理后使用 tf parse example 解码字符串记录 而不是在批处理之前使用 t
  • Ruby 中的每个自动计数器?

    我想使用 for each 和计数器 i 0 for blah in blahs puts i to s blah i 1 end 有更好的方法吗 Note 我不知道是否blahs是一个数组或一个散列 但必须这样做blahs i 不会让它变
  • 如何让eclipse记住ssh密钥密码?

    我将 Egit 与 Eclipse 结合使用来使用 git 并访问 github 一切工作正常 但我想省略一件事id rsa每次我将提交推送到 github 时都需要输入密钥密码 每次重新启动 Eclipse 并尝试推送时 都会要求我输入密
  • 对齐CSS中旋转的元素

    我尝试旋转页面上的 div 并将其靠在其父元素 在本例中为主体 的左侧 我了解变换原点 但无论我插入什么值 它都无法正确对齐 http jsfiddle net QpHCM http jsfiddle net QpHCM HTML div
  • JSDOC:如何记录函数的内部变量

    有没有办法让 JSDOC 显示函数内部的变量而不使用 命名空间函数前面的注释 我做了一个小测试对象 但它只会显示内部变量k对于最后一个函数 它被声明为命名空间 我想使用 成员 注释和精确 name注释将在下面调用的第二个方法中显示内部变量d
  • 链接网页、Facebook Like 按钮和 Facebook 粉丝页面?

    这可能吗 当有人点击 Facebook Like 按钮时 他 她会与 Facebook 上的朋友分享网页 URL 通过同样的点击 用户也成为该网站 Facebook 粉丝页面的粉丝 Thanks 虽然可以在您的网站上添加喜欢按钮来喜欢您的
  • 在 postgresql 中编写我自己的聚合函数

    我从来没有写过自己的聚合 只写过存储过程 我需要一些建议 我想编写一个自定义聚合 它将返回整数行的最大值并将其增加 10 我该怎么做 我试过这个 CREATE AGGREGATE incremented max v SFUNC max ST
  • 扩展 C# 语言?

    基本上我想知道的是是否有任何方法可以向基于 net 的语言添加新的 语句 我正在寻找的一个例子是类似介绍public class MyClass decoratorOf ClassWithLotsOfMethods并在预编译时将其更改为普通
  • removeAttribute() 不适用于 DOM

    为什么不removeAttribute 删除以下代码中的任何内容 div Element with style div br br
  • Git克隆无法创建文件

    尝试克隆远程 git 存储库 裸 时 我收到如下几个错误 之后 git 停止 error unable to create file frozen email lamson mymailserver run queue mark name
  • Lasso 和 RobustScaler 之后如何对回归预测进行逆变换?

    我试图弄清楚如何在使用 RobustScalar 和 Lasso 后取消缩放数据 大概使用 inverse transform 进行预测 下面的数据只是一个例子 我的实际数据更大 更复杂 但我希望使用 RobustScaler 因为我的数据
  • React router v4 - 在同一路由上渲染两个组件

    我有这些路线
  • 带有一个图标的 ShareActionProvider - 看起来就像一个简单的操作项

    我要显示ShareActionProvider on ActionBar 但具有自定义外观和感觉 只有一个简单的共享图标 没有边框 右侧没有最常用的应用程序图标 但提供弹出菜单与最常用的应用程序 有没有一种简单的方法可以做到这一点而无需实现
  • islice 一次读取 N 行的问题

    我正在尝试使用 from itertools import islice 以便使用 liblas 模块一次从 las 文件中读取多行 我的目标是逐块阅读 按照问题 Python如何一次读取N行 https stackoverflow com
  • 如何旋转 SCNBox

    我正在尝试旋转SCNBox我创建使用swipe gestures 例如 当我向右滑动时 该框应旋转 90 度Y axis当我向左滑动时为 90degs 为了实现这一点 我一直在使用节点的SCNAction rotateByX方法来执行旋转动
  • Java中如何预加载类? [复制]

    这个问题在这里已经有答案了 在我的 Swing 界面中首次打开新的 JInternalFrame 需要一些时间 根据探查器 大部分时间都花在 Classloader loadClass 方法上 据我所知 它会在需要时动态加载类 并且实际上
  • 如何创建播放列表

    我正在尝试创建一个仅提供编辑文本和图像按钮的应用程序 如果单击按钮 则会将专辑添加到播放列表中 并在编辑文本框中命名 专辑应随机选择 不用说 专辑曲目应该按正确的顺序排列 我可以稍后添加更多功能 例如 保存 覆盖 删除等 我有界面 但正在努
  • Magento 1.9 注册后重定向客户

    我想在 Magento 1 9 中成功注册后将所有客户重定向到自定义页面 我已经尝试了很多事情 首先 我成功地覆盖了核心客户帐户控制器 我尝试自定义以下操作 创建后动作 successProcessRegistration welcome客
  • 在 C# 中实现动态 Web Scraper 的逻辑

    我希望在 C 窗口窗体中开发一个 Web scraper 我想要完成的任务如下 从用户处获取 URL 在WINForms中的IE UI控件 嵌入式浏览器 中加载网页 允许用户选择文本 连续 小 不超过 50 个字符 从加载的网页 当用户希望
  • 第三个克隆海龟

    我在尝试制作追逐游戏时制作了这个程序 但我偶然发现了一些非常奇怪的东西 我创建了海龟的克隆体 但在地图中间出现了第三个 有谁知道是什么原因造成的 import turtle sc turtle Screen t turtle Turtle