Aprender Python- esos pozos esos años, entramos en

Aquellos de nosotros que entró en el pozo

comparación Pit 1-- número entero de la fosa

En Python todo es un objeto, el objeto es un número entero, cuando se comparan dos números enteros tienen dos operadores ==y issu diferencia es:

  • isCompara los dos valores de ID de objeto enteros son iguales, es decir, se comparan dos referencias representan la misma dirección en la memoria.
  • ==Comparar el contenido de dos objetos de enteros son iguales, para usar ==cuando en realidad, se llama objeto __eq__()método.

Sabemos isy ==diferencia Después de eso, podemos echar un vistazo al siguiente código para aprender comparación entero de Python en el que a cielo:

def main():
	x = y = -1
	while True:
		x += 1
		y += 1
		if x is y:
			print('%d is %d' % (x, y))
		else:
			print('Attention! %d is not %d' % (x, y))
			break
			
	x = y = 0
	while True:
		x -= 1
		y -= 1
		if x is y:
			print('%d is %d' % (x, y))
		else:
			print('Attention! %d is not %d' % (x, y))
			break


if __name__ == '__main__':
	main()

En parte como resultado de la operación anterior código como se muestra a continuación, este resultado se produce Python se realiza teniendo en cuenta el rendimiento de una optimización. Para objetos enteros, algún entero Python utiliza con frecuencia los objetos en caché, guardados en una llamada small_intslista de, en el ciclo de vida completo de Python, necesidad de hacer referencia a cualquiera de estos lugares entero objetos ya no son re-crear un nuevo objeto, es una referencia directa a la memoria caché de objetos. El valor del entero Python objetos conjunto usado con frecuencia en [-5, 256] este intervalo, si el rango entero de necesidades, directamente a partir de small_intsla obtención de referencias en lugar de crear un nuevo objeto temporal. Desde dentro del intervalo de más de 256 o menos de -5 no es un entero, por lo que incluso si dos números enteros son los mismos, pero son diferentes objetos.

Resultados de la Figura 1. La porción superior del programa

Por supuesto, sólo para que el pozo no era una mención merece la pena, si usted entiende las reglas anteriores, vamos a ver el siguiente código.

a = 257


def main():
	b = 257  # 第6行
	c = 257  # 第7行
	print(b is c)  # True
	print(a is b)  # False
	print(a is c)  # False


if __name__ == "__main__":
	main()

Resultados de la aplicación se ha escrito comentarios en el código. Suficiente hoyo él! Se ve a, by clos valores son los mismos, pero el isresultado de la operación no es lo mismo. ¿Por qué hay tal resultado, se dijo que en primer lugar nos bloque de programa Python. bloque de código se llama un programa mínimo básico de la unidad de ejecución, un módulo de archivo, una función del cuerpo, una clase, orden interactiva una sola línea de código se denominan bloques de código. El código de seguridad se compone de dos bloques de código, a = 257un bloque de código, mainla función es otro bloque. Para Python interna a mejorar aún más el rendimiento, todo objeto Integer creado en un bloque de código, si el valor no es small_intsen el rango de tampón, pero tiene un valor idéntica a la misma existe objeto entero en el mismo bloque de código, a continuación, una referencia directa al objeto de lo contrario, crear un nuevo objeto de esta regla no se encuentran en small_intszona negativa, no se aplica, no se aplica al valor de punto flotante negativo, pero para números y cadenas de punto flotante no negativos son aplicables, que los lectores puedan probarse a sí mismos . Así que  b is cregresó True, pero ay bno en el mismo bloque de código, aunque el valor es 257, pero se trata de dos objetos diferentes, isel resultado del cálculo es, naturalmente, Falsea. Con el fin de verificar que acaba de concluir, podemos tomar prestado dismódulo (escuchar a saber el nombre del módulo está desmontado) desde la perspectiva del código de bytes para mirar este código. Si usted no entiende lo que es el código de bytes, puede echar un vistazo a "programa de Python para hablar sobre el principio de funcionamiento," el artículo. Se puede utilizar para import disimportar el dismódulo y modificar el código de la manera como se muestra a continuación.

import dis

dis.dis(main)

código de resultado de la ejecución como se muestra en la figura. Se puede observar que la línea de código 6 y la línea 7, es decir, mainla función 257 se carga desde la misma ubicación, por lo que el objeto es el mismo; y el código en la línea 9 aes claramente diferente del lugar de carga, y por lo tanto referencia son diferentes objetos.

2. La Fig descompilar Python dis módulo de código

Si desea seguir perforando en este tema, recomiendo leer "Python implementa el objeto entero el principio de" el artículo.

Pit 2 - pit lista anidada

Python ha incorporado un tipo de datos lista llamada, es un contenedor que se puede utilizar para llevar a otros objetos (exacto decir que se refieren a otros objetos), la lista de objetos se puede llamar elementos de la lista, es claro que podemos como la lista de elementos de la lista, esto se llama una lista anidada. lista anidada puede simular la realidad en forma de una matriz, mapas 2D del juego (como zombis jardín), la junta (como el ajedrez, Reversi) y así sucesivamente. Sin embargo, cuando se utilizan listas anidadas que tener cuidado, de lo contrario es probable que se enfrentan a una situación muy incómoda, aquí es un pequeño ejemplo.

names = ['关羽', '张飞', '赵云', '马超', '黄忠']
subjs = ['语文', '数学', '英语']
scores = [[0] * 3] * 5
for row, name in enumerate(names):
    print('请输入%s的成绩' % name)
    for col, subj in enumerate(subjs):
        scores[row][col] = float(input(subj + ': '))
        print(scores)

Queremos entrar en una lista de cinco rendimiento de los estudiantes tres cursos, a continuación, definir una lista de cinco elementos, y cada elemento de la lista es una lista que consta de tres elementos, dicha lista con sólo una tabla que es lo mismo, el equivalente a cinco filas y tres columnas, a continuación, entrar en la circulación de todos los logros de los estudiantes a través de tres cursos de anidados para-in. Una vez finalizada la ejecución del programa, se encontró que todos los logros de 3 platos estudiante es exactamente el mismo, pero el estudiante está entrando en el marcador final.

Para llenar este hueco, hay que distinguir en primer lugar entre los objetos y las referencias a objetos estos dos conceptos, y para distinguir entre estos dos conceptos tienen que hablar primero de la pila y el montón de memoria. A menudo oímos gente hablando de la "pila" de la palabra, sino de hecho "montón" y "pila" son dos conceptos diferentes. Como todos sabemos, que tenga que tomar un poco de espacio de memoria se está ejecutando un programa para almacenar datos y código, entonces éstos lógicamente memoria y se puede dividir aún más. La mayoría entiende el lenguaje subyacente (como C) programador sabe, desde la parte de memoria de la lógica del programa a cinco puede ser utilizado, de mayor a menor según la dirección es: Pila (Stack), el montón (heap) , el segmento de datos (segmento de datos), el segmento de datos (área estática), y segmentos de código (segmento de código) de sólo lectura. En el que la pila se utiliza para almacenar unas variables locales, temporales, y guardar y restaurar la necesidad de la función del lugar llamada a utilizar el campo de datos, esta memoria se asigna automáticamente cuando el bloque de código inicia la ejecución, la ejecución automática del bloque de código se libera, por lo general por un compilador gestión automática; tamaño de la pila no es fijo, puede asignar dinámicamente y recuperar, por lo que si el programa tiene una gran cantidad de datos a procesar, estos datos se suelen colocar en el montón si el montón es no libera correctamente pérdida de memoria hace problemas y como Python, Java y otros lenguajes de programación utilizar el mecanismo de recolección de basura para lograr una gestión de memoria automática (recuperación automática de espacio de almacenamiento dinámico ya no está en uso). Así que el siguiente código, la variable ano es un objeto real, es una referencia a un objeto, el objeto es equivalente a la dirección registrada en el espacio de almacenamiento dinámico, a través del cual podemos acceder a la dirección correspondiente al objeto, de manera similar, la variable bes una referencia a la lista de contenedores citó una lista de los contenedores en el espacio de montón, mientras que la lista de contenedor y objeto real no se guarda, es sólo para guardar el objeto de referencia.

a = object()
b = ['apple', 'pitaya', 'grape']

Sabiendo esto, sólo podemos volver atrás y ver el programa, enumeramos [[0] * 3] * 5la operación, sólo la [0, 0, 0]dirección de la lista fueron copiados, y no crear un nuevo objeto de lista, contenedor, aunque hay cinco elementos, pero estos cinco elementos se refieren a la misma lista de objetos, que puede idfuncionar cheques scores[0]y scores[1]dirección confirmada. Por lo tanto, el código correcto debe ser modificado de la manera siguiente.

names = ['关羽', '张飞', '赵云', '马超', '黄忠']
subjs = ['语文', '数学', '英语']
scores = [[]] * 5
for row, name in enumerate(names):
    print('请输入%s的成绩' % name)
    scores[row] = [0] * 3
    for col, subj in enumerate(subjs):
        scores[row][col] = float(input(subj + ': '))
        print(scores)

o

names = ['关羽', '张飞', '赵云', '马超', '黄忠']
subjs = ['语文', '数学', '英语']
scores = [[0] * 3 for _ in range(5)]
for row, name in enumerate(names):
    print('请输入%s的成绩' % name)
    scores[row] = [0] * 3
    for col, subj in enumerate(subjs):
        scores[row][col] = float(input(subj + ': '))
        print(scores)

Si el uso de memoria no es muy comprensivo, puede buscar sitio web PythonTutor código proporcionado en la visualización de la función ejecutiva, a través de la visualización y ejecución, podemos ver cómo la memoria se asigna a fin de evitar pueden surgir al usar listas anidadas o copiar objetos fosa.

Figura 3. Crear una lista anidada de prácticas erróneas

Figura 4. Crear anidada manera lista de la derecha

 

Pit 3 - pit modificador de acceso

Python hecho usando persona programación orientada a objetos sabe, clase Python proporciona dos permisos de control de acceso, uno se da a conocer una privada (antes de la propiedad o método de doble subrayado). Y se utilizan para Java o C # idiomas de programación tales personas saben, el atributo de clase (abstracción de datos) son por lo general privada, cuya finalidad es proteger los datos en conjunto, y métodos de la clase (comportamiento abstracto) por lo general es pública, porque el objeto es proporcionar servicios para el mundo exterior. Pero Python no garantiza la privacidad de los miembros privados desde el nivel gramatical, porque es sólo tipo de los llamados miembros privados nombrados fueron transformadas, si se conoce el nombre de la regla puede miembros privados sigue directamente de acceso, consulte el siguiente código.

class Student(object):

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def __str__(self):
        return self.__name + ': ' + str(self.__age)


stu = Student('骆昊', 38)
print(stu._Student__name)
print(stu._Student__age)

¿Por qué Python para realizar los ajustes que tal? Con una máxima generalizada para explicar el problema: "Estamos todos los adultos que consienten aquí" (Somos todos adultos). Esta frase expresa una gran cantidad de programadores de Python un punto de vista común, es mejor abierto que cerrado, debemos ser responsables de su propio comportamiento y no para restringir el acceso a datos o métodos de nivel de idioma.

En Python, así que realmente no necesita el establecimiento de clase o método de tratamiento con el nombre que comienza con un doble subrayado a los miembros privados, ya que no tiene ninguna importancia práctica. Si desea propiedad de protección o método, se recomienda que los miembros protegidos de un solo subrayado inicial, a pesar de que en realidad no puede proteger la propiedad o método, pero es equivalente a la persona que llama una pista, dejamos el know persona que llama que esto no se supone que debe dirigir propiedad o método de acceso, y al hacerlo no afecta a la subclase de heredar estas cosas.

Necesidad de recordarle a la nota que aquellos magia clase de Python, como __str__, __repr__etc. Estos métodos son miembros no privados Oh, a pesar de que comienzan con un doble guión, sino que también terminan con un doble subrayado que este no es un miembro privado llamado el nombre, que es realmente hoyo para principiantes.

Publicados 348 artículos originales · ganado elogios 235 · vistas 700 000 +

Supongo que te gusta

Origin blog.csdn.net/GUDUzhongliang/article/details/104941928
Recomendado
Clasificación