Python连接

Python连接,python,Python,我对以下代码非常着迷,这些代码应该非常简单,但不起作用:/ class Triangulo_String: _string = '' _iteraciones = 0 _string_a_repetir = '' def __init__(self, string_a_repetir, iteraciones): self._string_a_repetir = string_a_repetir self._iteracione

我对以下代码非常着迷,这些代码应该非常简单,但不起作用:/

class Triangulo_String:

    _string = ''
    _iteraciones = 0
    _string_a_repetir = ''

    def __init__(self, string_a_repetir, iteraciones):
        self._string_a_repetir = string_a_repetir
        self._iteraciones = iteraciones

    def concatenar(self):
        for i in range(0, self._iteraciones, 1):
            self._string = self._string_a_repetir + self._string + '\n'
我正在将
\u iteraciones
初始化为
3
并将
\u string\u repetir
初始化为
'*'

输出结果是:

***
当我期待的时候:

*
**
***
我已经调试过了,在进行连接时,它只是连接了self。_string_a_repetir,而不是_string或换行符


这么简单的事情快把我逼疯了。

相关的部分在这一部分:

for i in range(0, self._iteraciones, 1):
    self._string = self._string_a_repetir + self._string + '\n'
让我们逐一进行迭代:

# Initially
_string = ''
_string_a_repetir = '*'
_iteraciones = 3

# i = 0
_string = _string_a_repetir + _string  + '\n'
        = '*'               + ''       + '\n'
        = '*\n'

# i = 1
_string = _string_a_repetir + _string  + '\n'
        = '*'               + '*\n'    + '\n'
        = '**\n\n'

# i = 2
_string = _string_a_repetir + _string  + '\n'
        = '*'               + '**\n\n' + '\n'
        = '***\n\n\n'
正如您所看到的,这完全是意料之中的事情,因为您每行不会重复该字符超过一次。您还错误地将前一个字符串与新字符串连接(将其放置在当前行的文本和换行符之间)

您正在寻找的是以下内容:

for i in range(0, self._iteraciones, 1):
    self._string = self._string + (self._string_a_repetir * (i + 1)) + '\n'
string*number
用于将
string
重复
number


一般来说,您不应该以这种方式使用这些类成员:

class Triangulo_String:
    _string = ''
    _iteraciones = 0
    _string_a_repetir = ''
这将创建这些成员作为类变量,这些变量在其所有实例中共享。如果从不更改类成员,这不会直接成为问题,但以后可能会导致混淆。您应该初始化
\uuuu init\uuuu
中的所有实例属性:

class Triangulo_String:
    def __init__(self, string_a_repetir, iteraciones):
        self._string = ''
        self._string_a_repetir = string_a_repetir
        self._iteraciones = iteraciones

相关位在本部分中:

for i in range(0, self._iteraciones, 1):
    self._string = self._string_a_repetir + self._string + '\n'
让我们逐一进行迭代:

# Initially
_string = ''
_string_a_repetir = '*'
_iteraciones = 3

# i = 0
_string = _string_a_repetir + _string  + '\n'
        = '*'               + ''       + '\n'
        = '*\n'

# i = 1
_string = _string_a_repetir + _string  + '\n'
        = '*'               + '*\n'    + '\n'
        = '**\n\n'

# i = 2
_string = _string_a_repetir + _string  + '\n'
        = '*'               + '**\n\n' + '\n'
        = '***\n\n\n'
正如您所看到的,这完全是意料之中的事情,因为您每行不会重复该字符超过一次。您还错误地将前一个字符串与新字符串连接(将其放置在当前行的文本和换行符之间)

您正在寻找的是以下内容:

for i in range(0, self._iteraciones, 1):
    self._string = self._string + (self._string_a_repetir * (i + 1)) + '\n'
string*number
用于将
string
重复
number


一般来说,您不应该以这种方式使用这些类成员:

class Triangulo_String:
    _string = ''
    _iteraciones = 0
    _string_a_repetir = ''
这将创建这些成员作为类变量,这些变量在其所有实例中共享。如果从不更改类成员,这不会直接成为问题,但以后可能会导致混淆。您应该初始化
\uuuu init\uuuu
中的所有实例属性:

class Triangulo_String:
    def __init__(self, string_a_repetir, iteraciones):
        self._string = ''
        self._string_a_repetir = string_a_repetir
        self._iteraciones = iteraciones

您仅在末尾添加换行符。。您希望它们位于现有字符串和新字符串之间。您只在末尾添加换行符。。你想让它们介于现有字符串和新字符串之间。哇,我不知道你可以“乘”多次重复字符串。。。但是有一些问题:-1现在我得到了我的预期输出(**)的第二行,为什么-2为什么将变量初始化为类成员或在init中很重要?哦,糟糕,
i
以值
0
开始,因此当然需要将字符串乘以
i+1
,以便第一行已经得到一颗星。在回答中更正了它。至于类成员,它们在所有实例之间共享。如果您对原始代码执行了
triangulao\u String.\u String='foo'
,则之后调用
concatenar
的所有实例都将使用该值
'foo'
作为
\u String
的第一个值。因此,您将得到
'foo*\n**\n***\n'
作为结果。这不太可能是需要的,因此您应该始终在
\uuuu init\uuuuu
中初始化它。哇,我不知道您可以“乘法”多次重复字符串。。。但是有一些问题:-1现在我得到了我的预期输出(**)的第二行,为什么-2为什么将变量初始化为类成员或在init中很重要?哦,糟糕,
i
以值
0
开始,因此当然需要将字符串乘以
i+1
,以便第一行已经得到一颗星。在回答中更正了它。至于类成员,它们在所有实例之间共享。如果您对原始代码执行了
triangulao\u String.\u String='foo'
,则之后调用
concatenar
的所有实例都将使用该值
'foo'
作为
\u String
的第一个值。因此,您将得到
'foo*\n**\n***\n'
作为结果。这不太可能是需要的,因此您应该始终在
\uuuu init\uuuu
中对其进行初始化。