Найти - Пользователи
Полная версия: Странности с print и присвоением значения функции
Начало » Python для новичков » Странности с print и присвоением значения функции
1
Вит
Здравствуйте!
Понадобилось написать программу, которая бы находила базисные вектора обратной решётки для этого написал программу на питоне:

#-*- coding: utf-8 -*-

a1={"x": 1, "y": 0, "z": 0 }
a2={"x": 0, "y": 1, "z": 0 }
a3={"x": 0, "y": 0, "z": 1 }
b1={"x": 0, "y": 0, "z": 0 }
b2={"x": 0, "y": 0, "z": 0 }
b3={"x": 0, "y": 0, "z": 0 }
v={"x": 0, "y": 0, "z": 0 }

def scalar(first = None, second = None): #вычисление скалярного произведения координат
return first["x"]*second["x"]+first["y"]*second["y"]+first["z"]*second["z"]

def vector(first = None,second = None): #вычисление векторного произведения
v["x"]=first["y"]*second["z"]-first["z"]*second["y"]
v["y"]=first["z"]*second["x"]-first["x"]*second["z"]
v["z"]=first["x"]*second["y"]-first["y"]*second["x"]
return v

def triple(first = None, second = None, third = None): #вычисление смешанного произведения
return scalar(first,vector(second,third))

def recvect1(first = None, second = None, third = None): #вычисление первого вектора обратной решетки
b1 = vector(second,third)
div = triple(first,second,third)
b1["x"] = b1["x"]/div
b1["y"] = b1["y"]/div
b1["z"] = b1["z"]/div
return b1

def recvect2(first = None, second = None, third = None): #вычисление второго вектора обратной решетки
b2 = vector(third,first)
div = triple(second,third,first)
b2["x"] = b2["x"]/div
b2["y"] = b2["y"]/div
b2["z"] = b2["z"]/div
return b2

def recvect3(first = None, second = None, third = None): #вычисление третьего вектора обратной решетки
b3 = vector(first,second)
div = triple(third,first,second)
b3["x"] = b3["x"]/div
b3["y"] = b3["y"]/div
b3["z"] = b3["z"]/div
return b3

b1 = recvect1(a1,a2,a3)
print b1
b2 = recvect2(a1,a2,a3)
print b2
print "b1 now is ", b1
b3 = recvect3(a1,a2,a3)
print b3
print "b2 now is ", b2
print "b1 now is ", b1
В результате выполнения получается, что после каждого из присвоений в конце меняется значение предыдущей переменной:

{'y': 0, 'x': 1, 'z': 0}
{'y': 1, 'x': 0, 'z': 0}
b1 now is {'y': 1, 'x': 0, 'z': 0}
{'y': 0, 'x': 0, 'z': 1}
b2 now is {'y': 0, 'x': 0, 'z': 1}
b1 now is {'y': 0, 'x': 0, 'z': 1}
Почему так происходит?
Почему он сам упорядочивает список, так что он начинается с “y”, а не с “x”?
Evgen
Что бы значение не менялось нужно объявление вектора v перенести из глобальной области в ту функцию где он используется.
А для словарей порядок вывода вроде бы не гарантируется. Напишите вспомогательную функцию для вывода вектора так как вам надо, что-нибудь типа этого:
def print_d(d):
print "{x = %(x)s, y = %(y)s, z = %(z)s}" % d
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB